代码之家  ›  专栏  ›  技术社区  ›  dimba

带if语句的C预处理器

  •  6
  • dimba  · 技术社区  · 14 年前

    我有以下宏:

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

    用户代码应如下所示:

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

    这里强调的是花括号-我想防止“if”从宏变成“eat”其他代码:

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

    IF_TRACE_ENABLED “吃”else块。

    3 回复  |  直到 9 年前
        1
  •  11
  •   Michael Burr    14 年前

    else 防止被无意中吃掉的条款:

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

    旁注:支架周围的 printf() 其他的 bla bla bla 仍然会被束缚在 if 宏中的语句。

        2
  •  2
  •   ptomato    14 年前

    #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

        3
  •  0
  •   user191776 user191776    14 年前

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

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