这些编译器指令有什么区别?

时间:2009-10-05 03:36:38

标签: c c-preprocessor preprocessor-directive

这些指令之间有什么区别?

#ifdef FOO

#if defined FOO

#if defined(FOO)

我正在使用CCS编译器,但我也对其他 C 编译器感兴趣。

4 个答案:

答案 0 :(得分:9)

从我所看到的,#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编译正确,因此建议#if defined是正确的ANSI C.此外,this ANSI C summary from 1987列出#if defined作为预处理器的新定义行为ANSI标准 - 此 应该是您将使用的任何ANSI兼容编译器的标准。

如果您没有使用#if defined,则必须执行

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

此外,the Redhat manual for the C preprocessor

  

#if defined MACRO正好等同于#ifdef MACRO

答案 1 :(得分:3)

根据C99标准,所有3种表格完全相同且有效。通常#ifdef是首选,因为它比其他两种形式短,但在某些情况下您可能希望使用其他形式:

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

    #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
    ...
    #endif
    
  • 如果您有多个子句,则使用#elif defined(...)#else#ifdef更容易:

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

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

答案 2 :(得分:1)

#ifdef #if defined 的缩写,我认为你不需要括号,所以基本上它们是相同的。

来自Turbo C,我习惯于查看 #ifdef 而不是 #if已定义

答案 3 :(得分:1)

最初只有#ifdef,但当#if出现时,必须defined() #if才能超越#ifdef