c++ - 如何抑制来自 ON_BLOCK_EXIT 的警告(ScopeGuard 的一部分)

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

ON_BLOCK_EXITScopeGuard 提供的实用程序宏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 ) 可用于暂时禁用警告。但是,这有 2 个问题:1.) 它不能放在引起警告的语句旁边,而必须放在范围结束行的正上方。 2.) 作为此的必然结果,它将屏蔽掉当前范围产生的所有 警告 4189。

使用 Visual Studio 2010 有什么方法可以禁用仅由使用 ON_BLOCK_EXIT 创建的那些对象产生的特定警告(最好不必更改调用站点,类似于 GCC 的 __attribute__((未使用)))?

最佳答案

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

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

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

关于c++ - 如何抑制来自 ON_BLOCK_EXIT 的警告(ScopeGuard 的一部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901116/

相关文章:

c# - 传递结构似乎会损坏数据

c++ - 既然 std::vector::iterator 是遗留的,那么获得 std::vector 迭代器的正确/推荐方法是什么?

c++ - 如果传入任何类型的列表,则尝试禁用函数

visual-studio-2010 - 在 Visual Studio 2010 中使用 MS SQL Server 2005 Reporting Services

C++ 代码未在 Visual Studio 中运行

visual-c++ - Visual C++ 6.0 名称修改,即使在 extern "C"和 dllexport 内,也不会生成 RPC stub

c++ - Microsoft Visual C++是否支持WebAssembly作为目标?

c++ - 当我的 C++ 应用程序运行时,如何防止 Windows 进入休眠状态?

c - 使用有序编译指示的 msvc 上的 openmp 比预期慢

c - 在 OpenCV 中使用直方图数据跟踪对象