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

#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++调试宏吗?

编辑:

推荐答案

Is the second code snippet analogous to the one in C?

或多或少它的功能更强大,因为你可以在参数中包含<<个独立的值,所以使用一个参数,你会得到一些需要C语言中可变数量的宏参数.另一方面,人们在参数中包含分号的可能性很小.甚至会因通话后忘记分号而出错.所以我会把这个包含在do块中:

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

Do you have any favourite C++ debug macros?

我喜欢上面的那个,而且经常用它.我的no-op通常只读为

#define DEBUG(x)

这对优化编译器也有同样的效果.尽管@Tony D下面的 comments 是正确的:这可能会导致一些语法错误未被发现.

我有时还包括运行时判断,从而提供某种形式的调试标志.正如@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中的公钥字符串创建EVP_PKEY

插入元素后,Sizeof操作符无法正常工作

C指针地址和转换

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

如何使用Python C API实现多线程程序?

如何设置指针指向在函数中初始化的复合文字中的整数?

C由四个8位整数组成无符号32位整数

如何将常量char*复制到char数组

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

整型文字后缀在左移中的用途

1处的解析器错误:yacc语法的语法错误

为什么数组的最后一个元素丢失了?

如何使用C++在控制台中以彩色打印被阻止的客户端

如何在提取的索引中分配空值?

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

用于计算位数和的递归C函数

在C中打印指针本身

使用 strtok 多次分割一个字符串会导致意外行为

中位数和众数不正确