当我想禁用调试检查时,将调试宏设置为空字符串是否可以?
在assert
定义时,BOOST_ASSERT
和((void)0)
都设置为NDEBUG
。
为什么不做这个呢?
#ifdef NDEBUG
#define MY_DEBUG_MACRO_FUNCTION(x,y,z) ""
#elif
// define macros
#endif
答案 0 :(得分:4)
这个想法是宏在发布版本上什么都不做。您可以将其定义为空字符串文字,因为"";
是一个有效的表达式。我认为被定义为((void)0)
的原因是,实现不会对表达式发出警告。我没有充分的理由说出这一点,但是一些最低限度的测试显示"";
会产生警告,而((void)0)
却没有。当然,警告不是标准化的,所以可能有一个特定的实现也会对((void)0)
发出警告,但是它必须将assert
定义为{{1}上没有的其他内容。构建或者对用户来说非常烦人。
答案 1 :(得分:2)
不是不行。但是你可以将宏的“主体”变为空:
#define MY_DEBUG_MACRO_FUNCTION(x,y,z)
请注意,没有定义任何内容,因此在使用时不会将任何内容放入源中。
答案 2 :(得分:0)
按主题行使用#undef。当存在宏版本和函数的C版本时,这很有用。这样,您可以在内联的扩展宏上使用已编译的代码。