2

在浏览开源.NET Framework 4.7的源代码时,我偶然发现了 C++ 标头sal.h,发现一行代码[source_annotation_attribute( SA( Method ) )]似乎与C#中的属性和AttributesUsage类相似。

现在我知道,一般来说, C++ 中没有像 C# 中那样的用户定义属性,我的第一个猜测是这[source_annotation_attribute( SA( Method ) )]只是一个宏,但它既没有在任何其他头文件中定义,sal.h也没有在任何其他头文件中定义,因为sal.h没有#include

我的下一个猜测是它[source_annotation_attribute]实际上是内置在 MSVC 中的,就像例如[[noreturn]]属性一样。

如果有人可以阐明它的实际含义,如果我可以声明自己的类似属性,如果它没有内置到编译器中,我会很高兴。如果您想亲自查看,则特定文件是\Source\externalapis\legacy\vctools\vc12\inc\vc\sal.h并且该属性(以及其他)出现在 line 中1934

下面是一个使用示例sal.h

[source_annotation_attribute( SA( Method ) )]
struct __M_
{
#ifdef __cplusplus // [
    __M_();
#endif // ]
   int __d_;
};
typedef struct __M_ __M_;

提前谢谢了。

4

1 回答 1

1

总结@VTT 已经说过的内容,它看起来像是source_annotation_attribute一个编译器内置构造,​​它是作为Microsoft对 C++ 扩展的一部分提供的(即使在那里没有提到它,因为它是一个实现细节,仅供内部使用) 仅在使用编译器开关编译时有效/Ze

更重要的是,微软的SAL深深地内置在 Visual Studio 中,即

构建 -> 在解决方案上运行代码分析,并且由于 Visual Studio(显然)使用他们的 MSVC 编译器,微软不会在他们的编译器中构建任何这样的内部结构并不是太难以置信。

于 2017-07-11T09:20:41.427 回答