如果有的话,这些指令的区别是什么?这些编译器指令有什么区别?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我使用CCS编译器,但我感兴趣的其他Ç编译器为好。
如果有的话,这些指令的区别是什么?这些编译器指令有什么区别?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我使用CCS编译器,但我感兴趣的其他Ç编译器为好。
从我所看到的,对于#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
。
啊,我认为这可能是这样的,我在回答时正在试验它。 :-) – 2009-10-05 04:22:25
此外,我发现#if!defined(FOO)与#ifndef FOO – 2009-10-08 14:26:13
的#ifdef是短期的#如果定义,我认为你不需要括号对双方都不利,所以他们基本上是相同的。
从Turbo C的到来,我已经习惯了看着的#ifdef而不是#如果定义
根据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
一起使用括号是可选的;我更喜欢用它们来增加清晰度。
本来也仅有#ifdef
,但是当#if
来了这是necessay有defined()
为了#if
到超集#ifdef
。
它们拼写有所不同。 – 2009-10-05 03:39:23