2

__declspec(nothrow)オブジェクト参照を返すいくつかのメンバー関数に適用したいと思います。たとえば、この関数 (MyClass.h 内) に追加したいと思います。

CMyClass& operator= ( IN UInt32 nValue )
{
    return ( SetValue ( nValue ) );
};

VC++のドキュメントには、次のように関数の戻り値の型の後に追加する必要があると書かれています。

return-type __declspec(nothrow) [call-convention] function-name ([argument-list])

これに従えば、私の機能のほとんどは で正常に動作し__declspec(nothrow)ます。ただし、上記のメンバー関数 (または a を返す他の関数CMyClass&) に対してこれを行うと、コンパイル エラーが発生します。

error C2059: syntax error : '__declspec(nothrow)'

戻り値の型の前に配置するとコンパイルされますが、ドキュメントには、__declspec() が間違った場所に配置されている場合、コンパイラは警告やエラーなしでそれを無視する可能性があるとも書かれています。

正しい使い方は__declspec(nothrow)

4

1 に答える 1

3

正しい構文は次のとおりだと思います(ただし、100%確実ではありません)。

CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )

コンパイラは、単純な宣言の場合と同じ規則に従って関数宣言を行うようで、&(または*) は . の後に続きますdeclspecこれは、 MSDN ドキュメントの一部と一致します。

__declspec キーワードは、単純な宣言の先頭に配置する必要があります。コンパイラは、* または & の後、および宣言内の変数識別子の前に配置された __declspec キーワードを警告なしで無視します。

他の人が指摘しているように、これは時間の無駄です。 throw()同じ奇妙な解析の問題はなく、ドキュメントには同等であると明確に記載されています。

次のプリプロセッサ ディレクティブがある場合、以下の 3 つの関数宣言は同等です。

#define WINAPI __declspec(nothrow) __stdcall

void WINAPI f1();
void __declspec(nothrow) __stdcall f2();
void __stdcall f3() throw();

于 2012-02-10T06:24:44.740 に答える