1

ON_BLOCK_EXITScopeGuard 実装によって提供されるユーティリティ マクロです。スコープ外になったときにユーザー提供のデストラクタを実行するという唯一の理由で、ローカル オブジェクトを定義します。次のように定義されています。

#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)

#define ON_BLOCK_EXIT ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeGuard

次のように使用できます。

void foo() {
    HANDLE hFile = CreateFile( ... );
    ON_BLOCK_EXIT( CloseHandle, hFile );
    // more...
    // ... code...
    // ... following
} // warning C4189

Visual Studio 2010 でコンパイルすると、上記のコードは次のように生成されますwarning C4189: 'scopeGuard3' : local variable is initialized but not referenced

#pragma warning( suppress : 4189 )警告を一時的に無効にするために使用できます。ただし、これには 2 つの問題があります。1.) 警告の原因となるステートメントの隣に配置することはできませんが、スコープを終了する行のすぐ上に配置する必要があります。2.) これの当然の結果として、現在のスコープに起因するすべての警告 4189 がマスクされます。

Visual Studio 2010 を使用して、ON_BLOCK_EXIT(できれば GCC の__attribute__((unused)).

4

1 に答える 1

1

私が最終的に行ったソリューションは、Visual Studio 2005 以降で機能します。

#define ON_BLOCK_EXIT( ... ) ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = \
                                 MakeGuard( __VA_ARGS__ ); \
                                 (void)ANONYMOUS_VARIABLE(scopeGuard)

元のマクロは完全な式に展開されなかったため、インストルメンテーションを追加して、コンパイラに警告を発生させないように指示する方法がありませんでした。可変個引数マクロを使用すると、そのオプションが提供されました。

于 2012-12-17T22:31:44.810 に答える