2009-10-05 98 views
3

如果有的话,这些指令的区别是什么?这些编译器指令有什么区别?

#ifdef FOO 

#if defined FOO 

#if defined(FOO) 

我使用CCS编译器,但我感兴趣的其他Ç编译器为好。

+2

它们拼写有所不同。 – 2009-10-05 03:39:23

回答

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

+0

啊,我认为这可能是这样的,我在回答时正在试验它。 :-) – 2009-10-05 04:22:25

+0

此外,我发现#if!defined(FOO)与#ifndef FOO – 2009-10-08 14:26:13

1

的#ifdef是短期的#如果定义,我认为你不需要括号对双方都不利,所以他们基本上是相同的。

从Turbo C的到来,我已经习惯了看着的#ifdef而不是#如果定义

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一起使用括号是可选的;我更喜欢用它们来增加清晰度。

1

本来也仅有#ifdef,但是当#if来了这是necessay有defined()为了#if到超集#ifdef