c++ - C++ 中的调试宏

标签 c++ c debugging c-preprocessor

我刚刚在 C 中遇到了一个我非常喜欢的 DEBUG 宏

#ifdef DEBUG_BUILD
#  define DEBUG(x) fprintf(stderr, x)
#else
#  define DEBUG(x) do {} while (0)
#endif

我猜 C++ 类似物是:-

#ifdef DEBUG_BUILD
#  define DEBUG(x) cerr << x
#else
#  define DEBUG(x) do {} while (0)
#endif
  1. 第二个代码片段是否类似于 C 中的代码片段?
  2. 你有什么喜欢的 C++ 调试宏吗?

编辑: “调试宏”是指“在 Debug模式下运行程序时可能派上用场的宏”。

最佳答案

第二个代码片段是否类似于 C 中的代码片段?

或多或少。它更强大,因为您可以包含 << - 参数中的分隔值,因此对于单个参数,您会得到需要在 C 中使用可变数量的宏参数的东西。另一方面,人们通过在参数中包含分号来滥用它的可能性很小。甚至会因为调用后忘记分号而遇到错误。所以我会把它包含在一个 do block 中:

#define DEBUG(x) do { std::cerr << x; } while (0)

你有什么喜欢的 C++ 调试宏吗?

我喜欢上面的那个并且经常使用它。我的无操作通常只是阅读

#define DEBUG(x)

这对于优化编译器具有相同的效果。尽管@Tony D 下面的评论是正确的:这可能会导致一些语法错误未被检测到。

我有时也会包含运行时检查,从而提供某种形式的调试标志。正如@Tony D 提醒我的那样,在其中添加 endl 通常也很有用。

#define DEBUG(x) do { \
  if (debugging_enabled) { std::cerr << x << std::endl; } \
} while (0)

有时我也想打印表达式:

#define DEBUG2(x) do { std::cerr << #x << ": " << x << std::endl; } while (0)

在某些宏中,我喜欢包含 __FILE__ , __LINE____func__ ,但这些通常是断言而不是简单的调试宏。

关于c++ - C++ 中的调试宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251038/

相关文章:

c++ - 我是否需要同步对 std::sort 中使用 std::execution::par 调用的元素的读取?

C++11 右值两次调用析构函数

c++ - 具有抽象成员的对象(无指针)

c - 使用 inotify 检测外部 IN_MOVED_FROM 重命名

c++ - 为什么每当我创建一个新的 C++ 项目时 Eclipse 默认为 Debug模式?

c++ - C++ 有没有像 getdelim 这样的函数?

c - 使用位移位提取单词的部分内容时避免出现警告消息

c - X11透明窗口: click-through only where alpha = 0

java - 抛出异常时中断

c# - 在 Visual Studio 2012 中运行到光标处