奇怪的SAL注释警告

时间:2009-03-16 23:32:17

标签: c++ annotations compiler-warnings sal

我正在尝试将Micosoft的SAL注释用于我的项目,但是我收到以下警告,我不知道为什么。

作为一个例子,我创建了一个新的C ++控制台应用程序,并拥有以下代码:

#include <sal.h>

class Whatever
{
public:
    _Check_return_ int Method(__in int number) ;
};

int main()
{
    return 0;
}

当我使用Visual Studio 2008编译时,收到以下警告:

警告C6540:在此函数上使用属性注释将使其所有现有的__declspec注释无效

在文件“c1xxast”

我做错了什么?如果我删除_Check_return___in,警告就会消失。

我找不到警告C6550的任何参考。但是,可以在此处找到相同的文字:http://msdn.microsoft.com/en-us/library/dd445322.aspx,但它不是很有帮助。

2 个答案:

答案 0 :(得分:10)

问题可能是因为您正在混合SAL注释类型。虽然在MSDN上非常清楚,但有两种类型的SAL注释:属性和......呃......不是。

#define VC2005中的<sal.h>使用非属性版本,并以下划线开头,后跟小写字母。较新的VC2008版本扩展为编译器属性,并以下划线后跟大写字母开始(和结束)。

您混合了两种类型:

属性:

  • _IN _
  • _Check_return _

非属性:

  • __中
  • __ checkReturn

尝试更改注释以始终使用单一类型。

This blog post对此进行了更多解释。

答案 1 :(得分:1)

您必须将SAL注释添加到方法的声明和定义中。我猜测SAL很难过,因为它无法找到方法的定义并假设缺少属性。

编辑澄清

对于非抽象方法,SAL注释必须出现在两个位置。对于抽象方法,SAL不会查找定义。在某些配置中,它实际上将确保接口的实现具有适当的符号。