【问题标题】:Strange SAL annotation warning奇怪的 SAL 注释警告
【发布时间】:2009-03-16 23:32:16
【问题描述】:

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

【问题讨论】:

    标签: c++ annotations compiler-warnings sal


    【解决方案1】:

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

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

    你混合了这两种类型:

    属性:

    • _In_
    • _Check_return_

    非属性:

    • __in
    • __checkReturn

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

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

    【讨论】:

    • 谢谢,就是这样。没有更多警告!
    【解决方案2】:

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

    编辑说明

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

    【讨论】:

    • 那么这是否意味着 SAL 不能与接口一起使用?
    • @Kevin,澄清了我的回答。简而言之,SAL 可以和接口一起使用
    • @JaredPar:好的,谢谢。带有 __in 参数的 _Check_return 似乎是其中一种配置,因为使方法纯虚拟不会删除警告:(
    • @Kevin,很有趣。我将对此进行一些阅读,因为我以前从未见过这种行为。
    • @Kevin,您是否尝试过添加一个实现以查看它是否可以解决问题?
    猜你喜欢
    • 2012-03-04
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多