如何禁用宏功能?

时间:2011-11-16 05:16:14

标签: macros c-preprocessor

当我想禁用调试检查时,将调试宏设置为空字符串是否可以? 在assert定义时,BOOST_ASSERT((void)0)都设置为NDEBUG

为什么不做这个呢?

#ifdef NDEBUG

#define MY_DEBUG_MACRO_FUNCTION(x,y,z) ""

#elif
  // define macros
#endif

3 个答案:

答案 0 :(得分:4)

这个想法是宏在发布版本上什么都不做。您可以将其定义为空字符串文字,因为"";是一个有效的表达式。我认为被定义为((void)0)的原因是,实现不会对表达式发出警告。我没有充分的理由说出这一点,但是一些最低限度的测试显示"";会产生警告,而((void)0)却没有。当然,警告不是标准化的,所以可能有一个特定的实现也会对((void)0)发出警告,但是它必须将assert定义为{{1}上没有的其他内容。构建或者对用户来说非常烦人。

答案 1 :(得分:2)

不是不行。但是你可以将宏的“主体”变为空:

#define MY_DEBUG_MACRO_FUNCTION(x,y,z)

请注意,没有定义任何内容,因此在使用时不会将任何内容放入源中。

答案 2 :(得分:0)

按主题行使用#undef。当存在宏版本和函数的C版本时,这很有用。这样,您可以在内联的扩展宏上使用已编译的代码。