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 )
可用于暂时禁用警告。但是,这有两个问题:1.) 它不能放在导致警告的语句旁边,但必须放在结束范围的行的正上方。2.) 作为对此的推论,它将掩盖当前范围产生的所有警告 4189。
使用 Visual Studio 2010 是否有任何方法可以禁用仅由使用创建的那些对象产生的特定警告ON_BLOCK_EXIT
(最好不必更改调用站点,类似于 GCC 的__attribute__((unused))
)?