我刚刚在 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
- 第二个代码片段是否类似于 C 中的代码片段?
- 你有什么喜欢的 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/