- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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 )
可用于暂时禁用警告。但是,这有 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/
ON_BLOCK_EXIT 是 ScopeGuard 提供的实用程序宏implementation .它定义一个本地对象的唯一原因是当它超出范围时执行其用户提供的析构函数。它被定义为: #define
我是一名优秀的程序员,十分优秀!