c++ - MSVC 是否支持 C++11 样式的属性而不是 __declspec?
问题描述
我知道 C++11 风格的属性支持以命名空间为前缀的特定于供应商的属性。GCC 和 Clang 都支持带有前缀的各种属性gnu::
(gcc 和 clang)或clang::
(仅 clang),它们对应于等效__attribute__((...))
语法。
MSVC 属性的文档显示它支持标准属性以及gsl::
属性——但它没有提到__declspec
属性的向后兼容性。
我希望有类似__declspec(noinline)
的属性表示[[msvc::noinline]]
- 但我似乎找不到任何关于此的文档。
所以我的问题是,MSVC 是否支持__declspec
C++11 风格的属性?
如果没有,会有人碰巧知道他们没有吗?C++ 属性的最初基本原理__attribute__
是抽象各种编译器特定和__declspec
特性,所以如果在标准化 9 年后仍然不支持它会很奇怪。
解决方案
自 VC++ 2019 起没有[[msvc::noinline]]
或其他__declspec
等价物。
来自C++中的属性的官方 MSVC 文档:
在 Visual C++ 中,您可以使用
[[deprecated]]
属性而不是 usingdeclspec(deprecated)
,并且该属性将被任何符合要求的编译器识别。 对于所有其他declspec
参数,例如dllimport
anddllexport
,还没有等效的属性,因此您必须继续使用declspec
语法。
[编辑] 关于为什么 [[attributes]]
没有在 VC++ 中更广泛地使用(可能__declspec
完全替换)的信息令人惊讶地稀缺。我发现的最接近权威来源的是 reddit 线程C++ 属性说明符序列、MSVC 和我中的这些评论:
spongo2 - MSVC 开发经理
我们刚刚就这个话题进行了激动人心的团队室讨论。我们肯定看到了这里的用例,这很有趣,但我们想知道一个可以放置属性的位置数量很大并且不断增长的事实是否会导致令人惊讶的行为。
STL - MSVC STL 开发
我会在 STL 中使用 [[msvc::kitty]] 而不是 __declspec(kitty),以使我们的源代码更适合其他前端。我已经切换到使用 [[noreturn]] 而不是 __declspec(noreturn) 因为那是标准的。
我的阅读是,阻碍更广泛采用的是对属性范围与 __declspec 的关注,以及总体上的向后兼容性。
推荐阅读
- api - 如何通过 id 使用图形 API 从微软团队中删除用户
- python - 如何更新python gui?
- python - 无法自动推断 Quandl 时间序列数据帧的频率
- node.js - Keycloak 总是重定向到登录页面
- reactjs - 在 React 中的圆环图中绘制圆边
- php - 如何创建一个运行 php artisan migrate 命令的 php 文件?
- hive - NVL 配置单元内的子查询
- c - 将变量参数传递给另一个函数
- c++ - 当我使用 sizeof(array)/sizeof(array[0]) 作为 for 循环的条件时,为什么我不能在第二个循环中计算出数组?
- redis - | [ioredis] 未处理的错误事件:错误:getaddrinfo ENOTFOUND redis redis:6379 收集器