【问题标题】:Does MSVC support C++11-style attributes instead of __declspec?MSVC 是否支持 C++11 样式的属性而不是 __declspec?
【发布时间】:2020-07-11 17:51:12
【问题描述】:

我知道 C++11 风格的属性支持以命名空间为前缀的供应商特定属性。 GCC 和 Clang 都支持前缀为 gnu::(gcc 和 clang)或 clang::(仅限 clang)的各种属性,它们对应于等效的 __attribute__((...)) 语法。

documentation for MSVC attributes 表明它支持标准属性以及gsl:: 属性——但它没有提及__declspec 属性的向后兼容性。

我希望像 __declspec(noinline) 这样的东西有 [[msvc::noinline]] 的属性表示——但我似乎找不到任何关于此的文档。

所以我的问题是,MSVC 是否支持 __declspec 作为 C++11 风格的属性?

如果没有,会有人碰巧知道他们不知道吗? C++ 属性的原始rationale 是对各种编译器特定的__attribute____declspec 特性进行抽象,所以如果在标准化9 年后仍然不支持它会很奇怪。

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    自 VC++ 2019 起,没有 [[msvc::noinline]] 或其他 __declspec 等效项。

    来自Attributes in C++ 的官方 MSVC 文档:

    在 Visual C++ 中,您可以使用 [[deprecated]] 属性而不是使用 declspec(deprecated),并且该属性将被任何符合要求的编译器识别。 对于所有其他 @987654328 @ 参数如dllimportdllexport,目前还没有等价的属性,所以你必须继续使用declspec 语法。


    [ EDIT ] 关于为什么 [[attributes]] 在 VC++ 中没有得到更广泛使用的信息,也许完全取代了 __declspec,令人惊讶地稀缺。我发现的最接近权威来源的是reddit线程C++ attribute specifier sequence, MSVC and me中的这些cmets:

    spongo2 - MSVC 开发经理

    我们刚刚就这个话题进行了激动人心的团队室讨论。我们肯定看到了这里的用例,这很有趣,但我们想知道一个可以放置属性的位置数量很大并且不断增长这一事实是否会导致令人惊讶的行为。

    STL - MSVC STL 开发

    我会在 STL 中使用 [[msvc::kitty]] 而不是 __declspec(kitty),以使我们的源代码更适合其他前端。我已经改用 [[noreturn]] 而不是 __declspec(noreturn) 因为那是标准的。

    我的解读是,阻碍更广泛采用的是对属性范围与 __declspec 的关注,以及总体上的向后兼容性。

    【讨论】:

    • 哇,在我链接的同一页面上,我错过了那句话……哎呀!
    • @Human-Compiler 这是一个很好的问题,文档并没有真正涵盖“为什么不”部分。最后我对此进行了编辑。
    • 带有讨论的新更新很有趣!我还刚刚发现 MSVC 上的 /std:c++latest 将支持(或者可能已经支持 /std:c++latest[[msvc::forceline]] 属性。 source(来自 Jonathan Caves 的评论,6 月 25 日)
    【解决方案2】:

    根据Attributes in C++,唯一具有属性替换的 __declspec() 是 [[deprecated]],对于所有其他 __declspec() 修饰符,您必须继续使用 __declspec。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2013-10-15
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      相关资源
      最近更新 更多