如何抑制ON_BLOCK_EXIT(ScopeGuard的一部分)的警告

时间:2012-12-16 12:05:37

标签: c++ visual-studio-2010 visual-c++

ON_BLOCK_EXIT是由ScopeGuard implementation提供的实用程序宏。它定义了一个本地对象,其唯一原因是当用户提供的析构函数超出范围时执行它。它被定义为:

#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)))?

1 个答案:

答案 0 :(得分:1)

我最终用于Visual Studio 2005或更高版本的解决方案:

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

原始宏没有扩展为完整的表达式,因此无法附加任何检测来指示编译器不发出警告。使用variadic宏提供了该选项。