首页 > 解决方案 > MSVC 是否支持 C++11 样式的属性而不是 __declspec?

问题描述

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

MSVC 属性的文档显示它支持标准属性以及gsl::属性——但它没有提到__declspec属性的向后兼容性。

我希望有类似__declspec(noinline)的属性表示[[msvc::noinline]]- 但我似乎找不到任何关于此的文档。

所以我的问题是,MSVC 是否支持__declspecC++11 风格的属性?

如果没有,会有人碰巧知道他们没有吗?C++ 属性的最初基本原理__attribute__是抽象各种编译器特定和__declspec特性,所以如果在标准化 9 年后仍然不支持它会很奇怪。

标签: c++visual-c++

解决方案


自 VC++ 2019 起没有[[msvc::noinline]]或其他__declspec等价物。

来自C++中的属性的官方 MSVC 文档:

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


[编辑] 关于为什么 [[attributes]]没有在 VC++ 中更广泛地使用(可能__declspec完全替换)的信息令人惊讶地稀缺。我发现的最接近权威来源的是 reddit 线程C++ 属性说明符序列、MSVC 和我中的这些评论:

spongo2 - MSVC 开发经理

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

STL - MSVC STL 开发

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

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


推荐阅读