MSVC相当于__attribute __((warn_unused_result))?

Pau*_*l R 23 c c++ gcc gcc-warning visual-c++

我发现__attribute__ ((warn_unused_result))作为一种鼓励开发人员不要忽略函数返回的错误代码的方法非常有用,但是我需要将它与MSVC以及gcc和gcc兼容的编译器(如ICC)一起使用.Microsoft Visual Studio C/C++编译器是否具有等效机制?(到目前为止,我已经尝试过没有运气的MSDN.)

Alb*_*ert 13

是的_Check_return_.请参阅此处以获取类似注释的示例,此处为功能行为.它自MSVC 2012以来得到支持.

例:

_Check_return_
int my_return_must_be_checked() {
    return 42;
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 8

2012年MSVC及更新版本的更新

非常感谢@Albert指出,_Check_return_当使用SAL静态代码分析时,MSVC现在支持Visual Studio 2012中的注释.我正在添加这个答案,以便我可以包含一个对其他人有用的跨平台宏:

#if defined(__GNUC__) && (__GNUC__ >= 4)
#define CHECK_RESULT __attribute__ ((warn_unused_result))
#elif defined(_MSC_VER) && (_MSC_VER >= 1700)
#define CHECK_RESULT _Check_return_
#else
#define CHECK_RESULT
#endif
Run Code Online (Sandbox Code Playgroud)

请注意,与gcc 等人不同,(a)MSVC要求对函数的声明定义进行注释,并且(b)注释需要在声明/定义的开头(gcc允许).因此通常需要使用例如:


// foo.h

CHECK_RETURN int my_function(void); // declaration
Run Code Online (Sandbox Code Playgroud)


// foo.c

CHECK_RETURN int my_function(void)  // definition
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)


另请注意,如果从命令行进行编译,则需要/analyze(或-analyze)开关,如果使用Visual Studio IDE,则需要等效.这也有助于减慢构建速度.


Joh*_*ing 5

一些版本的VisualStudio包含一个静态分析工具,以前称为PREFast(现在简称为"C/C++代码分析").PREFast使用注释来标记代码.其中一个注释,MustCheck,可以满足您的需求.