代码之家  ›  专栏  ›  技术社区  ›  Jeanne Pindar

这些编译器指令之间的区别是什么?

  •  3
  • Jeanne Pindar  · 技术社区  · 15 年前

    如果有的话,这些指令之间的区别是什么?

    #ifdef FOO
    
    #if defined FOO
    
    #if defined(FOO)
    

    我正在使用ccs编译器,但我对其他编译器感兴趣 C 编译程序也是如此。

    4 回复  |  直到 9 年前
        1
  •  9
  •   Mark Rushakoff    15 年前

    据我所见,主要用途是 #if defined 在一行中检查多个宏定义。否则,对于单个宏定义条件,据我所知它们是相同的。

    #include <stdio.h>
    int main()
    {
    #if defined(FOO) && defined(BAR)
        printf("foobar!\n");
    #else
        printf("nothing.\n");
    #endif
        return 0;
    }
    
    $ tcc -DFOO -run a.c 
    nothing.
    $ tcc -DBAR -run a.c 
    nothing.
    $ tcc -DFOO -DBAR -run a.c 
    foobar!
    

    另外,上面的程序可以很好地编译 gcc -Wall -ansi a.c 所以这表明 #如果已定义 是正确的ANSI C。而且, this ANSI C summary from 1987 列表 如果定义 作为在ANSI标准下为预处理器新定义的行为--这 应该 在您将要使用的任何符合ANSI的编译器中都是标准的。

    如果你不使用 如果定义 你得这么做

    #ifdef FOO
    #ifdef BAR
        printf("foobar!\n");
    #endif /* BAR */
    #endif /* FOO */
    

    也, the Redhat manual for the C preprocessor

    #if defined MACRO 完全等同于 #ifdef MACRO .

        2
  •  3
  •   Adam Rosenfield    15 年前

    根据C99标准,所有三种形式都是完全等效和有效的。一般来说 #ifdef 首选,因为它比其他两个表单短,但在某些情况下,您可能希望使用其他表单:

    • 如果测试多个符号或更复杂表达式的定义:

      #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
      ...
      #endif
      
    • 如果你有多个从句,使用起来就容易多了 #elif defined(...) #else , γIFIFF :

      #if defined(ONE_THING)
      ...
      #elif defined(ANOTHER_THING)
      ...
      #elif defined(THIRD_THING)
      ...
      #else
      ...
      #endif
      

    括号的用法 defined 是可选的;我更喜欢使用它们来增加清晰度。

        3
  •  1
  •   Juparave    15 年前

    γIFIFF 是短的 如果定义 我想你们两个都不需要括号,所以基本上是一样的。

    来自涡轮增压器C,我习惯于看 γIFIFF 而不是 如果定义

        4
  •  1
  •   DigitalRoss    15 年前

    原来只有 #ifdef 但是,什么时候 #if 来了,这是必要的 defined() 为了 γIF 超集 γIFIFF .