我在c ++应用程序中有一个记录器,它使用如下定义:
#define FINEST(...) Logger::Log(FINEST, _FILE, __LINE, __func, __VA_ARGS_)
然而,我想要做的是能够关闭这些日志,因为它们对我的系统有严重的性能影响。并且,仅仅让我的Logger不写入系统日志是不够的。我真的需要摆脱日志产生的代码。
为了做到这一点,我将定义更改为:
#define FINEST(...)
哪个有效,但这会在我的代码中产生一大堆警告,因为变量现在未被使用。所以我想要的是一种实际上不存在的NULL FUNCTION,但不会对未使用的变量产生警告。
所以,换句话说,我希望它能在没有警告的情况下进行编译(即编译器认为变量用于函数),但该函数实际上并不存在于应用程序中(即不会产生性能损失)。
这可能吗?
谢谢!
答案 0 :(得分:4)
您是否考虑过关闭编译器的特定警告? 这可能不是一个好主意,但如果你需要一个快速而肮脏的解决方案......
答案 1 :(得分:3)
template<bool implemented>
void Logger::Log( ... );
template<>
void Logger::Log<true>( ... )
{
// with implementation
}
template<>
void Logger::Log<false>( ... )
{
// without implementation
}
// USE:
#define FINEST(...) Logger::Log<true>(FINEST, _FILE, __LINE, __func, __VA_ARGS_)
// or
#define FINEST(...) Logger::Log<false>(FINEST, _FILE, __LINE, __func, __VA_ARGS_)
// EVEN BETTER (w/o macro):
// flag to switch on/off logging
const bool with_log = true; // or =false
// use
Logger::Log<with_log>( /* place arguments here */ );
答案 2 :(得分:3)
您可以使用未命名的参数定义一个空函数:
void nullFunc(int, int, int, const char*, ...) {
}
然后重新定义您的宏以调用此函数:
#define FINEST(...) nullFunc(FINEST, _FILE, __LINE, __func, __VA_ARGS_)
答案 3 :(得分:3)
在comeau和GCC上,如果将变量包装到sizeof
中,警告就会消失:
#define FINEST(...) ((void)sizeof(__VA_ARGS__))
为了避免GCC上关于逗号运算符的左侧或右侧没有效果的警告(例如,如果它扩展为sizeof(a, b)
),您可以引入具有其自己的逗号运算符的debug-nullify类型:
struct debug_nullify { };
// doesn't need a definition
template<typename T>
debug_nullify operator,(debug_nullify, T const &);
#define FINEST(...) ((void)sizeof(debug_nullify(), __VA_ARGS__))
sizeof
的好处是不评估参数表达式。
答案 4 :(得分:2)
我建议在发行版中删除声明:
int somefunc(int foo, int bar, void* baz)
{
DEBUGVAR(Logger,log);
int othervar;
/* stuff */
MAYBELOG(log,"something happened: %i",othervar);
/* other stuff */
return 0;
}
in define:
#if DEBUGLEVEL>0
#define DEBUGVAR(type,...) type __VA_ARGS__
#define MAYBELOG(logger,str,...) logstuff(logger,__FLIE__,__LINE__,str,__VA_ARG__)
#else
#define DEBUGVAR(type,...)
#define MAYBELOG(logger,str,...)
#endif