带有if语句的C预处理器

时间:2010-09-28 07:54:14

标签: macros c-preprocessor

我有以下宏:

#define IF_TRACE_ENABLED(level)  if (IsTraceEnabled(level))

用户代码应如下所示:

IF_TRACE_ENABLED(LEVEL1)
{
    ... some very smart code
}

这里强调大括号 - 我想阻止“if”从宏到“吃掉”其他代码:

if (...)
   IF_TRACE_ENABLED(LEVEL1)
      printf(....);
else
   bla bla bla

在此示例中,IF_TRACE_ENABLED“吃掉”其他块。

是否有办法强制用户代码在没有卷曲制动的情况下编译或者还有其他定义宏来实现安全性?

3 个答案:

答案 0 :(得分:11)

这不会强制宏的用户使用大括号,但它会阻止else子句无意中被吃掉:

#define IF_TRACE_ENABLED(level)  if (!IsTraceEnabled(level)) {} else 

附注:问题第二个示例中printf()周围的大括号无法解决问题 - 与else关联的bla bla bla仍会绑定到if宏中的{1}}语句。

答案 1 :(得分:2)

你可以试试这个:

#define IF_TRACE_ENABLED(level) do { if(IsTraceEnabled(level)) {
#define END_TRACE_ENABLED } } while(0);

我认为没有办法从宏的开头行“强制执行”良好的语法。你需要使用两个。

修改

我在宏中添加了一对额外的括号,以避免出现歧义。

在回应评论时,这个宏应该像这样使用:

IF_TRACE_ENABLED(LEVEL1)
    printf("Trace\n");
END_TRACE_ENABLED

不作为陈述。为了记录,我认为这是对预处理器的滥用,没有人应该这样做。写出来有什么问题,必要时用#ifdef DEBUG括起来。

答案 2 :(得分:0)

这应该可行,但你也可以将if块的内容作为参数传递给宏:

#define IF_TRACE_ENABLED(level,content)  { if (IsTraceEnabled(level)) {content} }