3

我正在尝试为我的项目使用 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,但这不是很有帮助。

4

2 回答 2

10

问题可能是因为您混合了 SAL 注释类型。虽然在 MSDN 上说得很清楚,但 SAL 注释有两种类型:attribute 和 ... er ... not。

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

您混合了两种类型:

属性:

  • _在_
  • _Check_return_

非属性:

  • __在
  • __checkReturn

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

这篇博客文章对此进行了更多解释。

于 2009-03-21T18:08:42.113 回答
1

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

编辑澄清

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

于 2009-03-16T23:34:37.053 回答