[英]Somehow tell compiler to “Do not process line of code”
我正在尝试为调试日志记录创建一个宏。 这是一个额外的简化版本:
#if defined _DEBUG
#define LOG std::cout
#else
#define LOG IGNORETHISLINEOFCODE
#endif
/* ... */
LOG << "Here's some debug code";
我一直在想我可以告诉编译器忽略以“LOG”开头的这行代码的方法。 我个人并不寻找替代方法,例如#define LOG( ... ) (void)0
。 这是我尝试过的:
将lefthift操作符重载为void,作为内联constexpr,什么都不做(这仍然导致它在反汇编中可见;我不希望这样)
将LOG定义为: #define LOG //
,但注释标识符未替换
有任何想法吗? 就像我之前说的那样,我不想要任何替代方案,例如用#if defined _DEBUG
包围所有日志代码
如果您的C ++版本处理if constexpr
我会根据您的要求来了解这一行。
#include <iostream>
template <bool Log>
struct LOGGER {
template <typename T>
LOGGER& operator<<(T const &t) {
if constexpr (Log)
std::cout << t;
return *this;
}
};
LOGGER<false> LOG;
int main (int argc, char const* argv[])
{
LOG << "A log statement." << '\n';
return 0;
}
你的问题和约束( “我不想要任何替代方案” )非常具体。
我一直在想我可以告诉编译器忽略以“LOG”开头的这行代码的方法
不要这样做,它将被多线日志声明轻易打破。 任何可能因合法重新格式化而突然中断的代码最好避免。
接下来我们有
...仍然导致它在拆卸中可见...
如果代码真的死了,你有一个不错的编译器,你打开优化,这不应该是真的。 不过,这仍然是一些工作。
通常的解决方案是这样的
#ifdef NDEBUG
#define LOG(EXPR)
#else
#define LOG(EXPR) std::cerr << EXPR
#endif
这是一个替代方案,但它不是一个替代方案, 例如用#if defined
所有日志代码 ,所以我不知道它是否适合你。
它确实具有在任何优化级别上真正编译为空的优点。
另一种基于编译器优化能力的可能性:
#define LOG if (DEBUG) std::cout
现在你可以使用了
#define DEBUG false
LOG << "hello " << " world 1" << endl;
你应该能够使用const bool DEBUG = false
。
#if defined _DEBUG
#define LOG std::cout
#else
#define LOG /##/
#endif
这也有效。 这是原始问题的答案,所以我会将其标记为这样,但只知道这不支持多行操作。
我想你可以为多行操作做类似的事情。 我不知道它有多好用。
#if defined _DEBUG
#define LOG( in ) std::cout << in
#else
#define LOG( in ) /##/
#endif
更好的逻辑是定义跟踪器策略,您可以在应用程序启动时设置日志记录级别,然后使用跟踪级别来决定是否记录degug信息。 跟踪级别可以定义为枚举
enum Tracelevel{CRITICAL, ERROR, INFO, TEST, DEBUG};
setTraceLevel(TraceLevel trcLvl){
_traceLevel = trcLvl;
};
#if defined _DEBUG
if(_traceLevel == DEBUG) {\
#define LOG std::cout
}
#endif
可以找到一个轻量级记录器http://www.drdobbs.com/cpp/a-lightweight-logger-for-c/240147505?pgno=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.