c++ - 不知何故告诉编译器“不要处理代码行”
问题描述
我正在尝试创建一个用于调试日志记录的宏。这是一个额外的简化版本:
#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
解决方案
如果您的 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;
}
推荐阅读
- java - java中函数的导数
- regex - 如何使用 sed 或 awk 在一行中分离重复模式,并将它们保存到行中?
- r - `fourfoldplot` 在列标签中没有正确显示大小和颜色
- android - 如何在android中随手指移动一起移动视图?
- mysql - 棘手的 CTE - 递归 sql(编辑我的查询)
- javascript - JavaScript:模拟 CSS 三次贝塞尔函数()
- javascript - 如何停止退格键或删除键以删除光标前的文本
- r - 从宽到长收集数据帧并使用 R 中的 tidyverse 生成新列
- elasticsearch - 在弹性搜索中的反向嵌套聚合中添加子聚合
- c# - 在 C# 中创建 Javascript 样式对象