旧式与 C++11 属性语法

问题描述 投票:0回答:1

我所说的老式是指

__attribute__((visibility("default")))

我的意思是 C++11 语法

[[gnu::visibility("default")]]

我正在开发庞大的代码库,该代码库必须保持可使用 MSVC、GCC 和 Clang 进行构建。 最近我注意到我们不能将 C++11 风格的弃用属性与旧风格的可见性属性混合在一起。 示例:https://godbolt.org/z/do9f4446Y

这意味着我们必须在所有地方都坚持属性的旧式语法,或者我们应该将整个代码库切换为新语法。

这让我想到一个问题:现代 C++ 项目中首选哪种类型的属性?看来 github 上的大部分 C++ 代码仍在使用旧式属性,也许我遗漏了一些东西?

c++ c++11 gcc clang
1个回答
0
投票

新风格是首选 - 除非您需要 C++98 兼容性,在这种情况下(截至本文撰写时,2024 年)您将在 GCC 上使用

__attribute__
。 (Clang 17+,OTOH,终于在 C++98 模式下支持新式的
[[]]
属性。虽然它似乎在 [[gnu::visibility("foo")]] 拼写上有
a bug
...)

有一个让我惊讶的怪癖:特定于供应商的新型属性会获得供应商前缀,如

[[clang::trivial_abi]]
[[gnu::pure]]
中所示。但旧式语法(截至 2024 年)仍未更新为接受前缀 - 因此这些属性分别以旧式
__attribute__((trivial_abi))
__attribute__((pure))
拼写。您只需删除前缀即可。这可以说是更喜欢新样式的一个原因:它有一个合适的位置来放置该前缀,从而区分供应商特定的属性和标准属性!

在你的《Godbolt》中你写道:

// works, but old deprecation attribute does not supports string-parameter
class
  __attribute__((visibility("default")))
  __attribute__((deprecated))
  IOpenGLRenderingPipelineAccess3 {};

你一定是理解错了;参数化语法对我来说工作得很好,一直到 Clang 3.0(即时间的开始)和 GCC 4.5(但在 GCC 4.1 之后的某个时间开始)。

// OK, works great
class
  __attribute__((visibility("default")))
  __attribute__((deprecated("ASDF")))
  IOpenGLRenderingPipelineAccess3 {};
© www.soinside.com 2019 - 2024. All rights reserved.