Pup*_*sik 7 c++ visual-studio c++11 visual-studio-2013
我有以下代码:
try {
// do some stuff
}
catch(const my_exception_type& e) {
LOG("Exception %s", e.what());
throw;
}
Run Code Online (Sandbox Code Playgroud)
问题是在调试版本LOG中定义为#define LOG(...) real_logger(...),但在版本构建中定义为#define LOG(...) \\ do nothing.
当然,当我在Visual Studio中编译我的发布代码时,我得到了warning C4101: 'e' : unreferenced local variable.
处理异常日志记录的最佳做法是什么,而不会产生任何不必要的警告?
PS
我除了记录和重新抛出它之外什么都不做.
您可以通过将对象强制转换为 void 来将对象标记为“已使用”。它对生成的机器码没有影响,但会抑制编译器警告。
try {
// do some stuff
}
catch(const my_exception_type& e) {
(void)e;
LOG("Exception %s", e.what());
throw;
}
Run Code Online (Sandbox Code Playgroud)
您可以在每个 catch 块中添加#ifdef一行catch(非常具有侵入性)或仅添加一行:
catch(const my_exception_type& e) {
UNREFERENCED_PARAMETER(e);
LOG("Exception %s", e.what());
throw;
}
Run Code Online (Sandbox Code Playgroud)
并且警告消失了。或者,您可以仅在调试版本中#define MY_EXCEPTION_CATCH(...)定义参数。e