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__
,但它们通常是断言,而不是简单的调试宏.