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