【发布时间】:2018-10-07 21:58:52
【问题描述】:
我正在尝试创建一个用于调试日志记录的宏。这是一个额外的简化版本:
#if defined _DEBUG
#define LOG std::cout
#else
#define LOG IGNORETHISLINEOFCODE
#endif
/* ... */
LOG << "Here's some debug code";
我一直在考虑如何告诉编译器忽略这行以“LOG”开头的代码。我个人不是在寻找替代方法,例如#define LOG( ... ) (void)0。这是我尝试过的:
将 void 的左移运算符重载为不执行任何操作的内联 constexpr(这仍会导致它在反汇编中可见;我不希望这样)
将 LOG 定义为:
#define LOG //,但注释标识符未替换
有什么想法吗?就像我之前说的,我不想要任何替代方案,例如用#if defined _DEBUG包围所有日志代码
【问题讨论】:
-
如果您只关心
cout,您就不能将流重定向到空吗? stackoverflow.com/questions/8246317/… -
@ClausJørgensen 这很有趣!将研究使用/测试它
-
@Tas 不幸的是,目标只是让编译器无法识别代码。这是一个好主意,如果我没有这样的特定限制,它会起作用:(
-
“告诉编译器忽略这行代码......我个人不是在寻找替代方法” 这很可能是不可能的。您可以做的是创建一个无操作重载
<<的类。这些行仍将被处理,但任何启用优化的体面的编译器在大多数情况下都不应该为它们发出任何代码。
标签: c++