C语言中的调试宏

新手上路,请多包涵

我刚刚在 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++ 调试宏吗?

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

原文由 user277465 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

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

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

 #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__ ,但这些通常是断言而不是简单的调试宏。

原文由 MvG 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我目前使用的日志宏:

 #ifndef DEBUG
#define DEBUG 1 // set debug mode
#endif

#if DEBUG
#define log(...) {\
    char str[100];\
    sprintf(str, __VA_ARGS__);\
    std::cout << "[" << __FILE__ << "][" << __FUNCTION__ << "][Line " << __LINE__ << "] " << str << std::endl;\
    }
#else
#define log(...)
#endif

用法:

 log(">>> test...");

输出:

 xxxx/proj.ios_mac/Classes/IntroScene.cpp][gotoNextScene][Line 58] >>> test...

原文由 firestoke 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏