奇妙なSALアノテーションの警告
-
19-08-2019 - |
質問
プロジェクトに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注釈がすべて無効になります
ファイル<!> quot; c1xxast <!> quot;
間違っているのは何ですか? _Check_return_
または__in
を削除すると、警告は消えます。
警告C6550への参照が見つかりません。ただし、同じテキストはここにあります: http://msdn.microsoft.com /en-us/library/dd445322.aspx ですが、あまり役に立ちません。
解決
問題は、SAL注釈タイプを混合していることが原因である可能性があります。 MSDNでは非常に明確になっていますが、SALアノテーションには2つのタイプがあります。属性と... er ...ではありません。
#define
VC2005の<sal.h>
は非属性バージョンを使用し、アンダースコアで始まり、その後に小文字の文字が続きます。新しいVC2008バージョンは、コンパイラー属性に拡張され、アンダースコアの後に大文字の文字が続く(および終了する)。
2つのタイプが混在しています:
属性:
- _In _
- _Check_return _
非属性:
- __ in
- __ checkReturn
一貫して単一の型を使用するように注釈を変更してみてください。
このブログ投稿でこれについてもう少し説明します。
他のヒント
メソッドの宣言と定義の両方にSAL注釈を追加する必要があります。 SALがメソッドの定義を見つけることができず、属性が欠落していると想定しているため、SALの動揺を推測しています。
編集明確化
SAL注釈は、非抽象メソッドの両方の場所に表示する必要があります。抽象メソッドの場合、SALは定義を探しません。特定の構成では、実際にインターフェイスの実装に適切な表記法が適用されます。