如何禁止显示来自ON_BLOCK_EXIT的警告(ScopeGuard 的一部分)
How to suppress warnings from ON_BLOCK_EXIT (part of ScopeGuard)
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))
)?
我最终选择的解决方案适用于Visual Studio 2005或更高版本:
#define ON_BLOCK_EXIT( ... ) ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) =
MakeGuard( __VA_ARGS__ );
(void)ANONYMOUS_VARIABLE(scopeGuard)
原始宏未扩展为完整表达式,因此无法追加任何检测来指示编译器不引发警告。使用可变参数宏提供了该选项。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- 如何禁止显示来自ON_BLOCK_EXIT的警告(ScopeGuard 的一部分)