这些指令之间有什么区别(如果有的话)?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我正在使用 CCS 编译器,但我也对其他C编译器感兴趣。
这些指令之间有什么区别(如果有的话)?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我正在使用 CCS 编译器,但我也对其他C编译器感兴趣。
从我所见,主要用途#if defined
是在一行上检查多个宏定义。否则,对于单个宏定义条件,据我所知,它们是相同的。
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ tcc -DFOO -运行交流 没有。 $ tcc -DBAR -运行 ac 没有。 $ tcc -DFOO -DBAR -运行 ac 富吧!
此外,上面的程序编译得很好,gcc -Wall -ansi a.c
因此表明#if defined
ANSI C 是正确的。此外,1987 年的这个 ANSI C 总结列出#if defined
了 ANSI 标准下预处理器的新定义行为——这应该是您将使用的任何符合 ANSI 的编译器的标准.
如果您不使用#if defined
,则必须这样做
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
#if defined MACRO
正好等价于#ifdef MACRO
。
根据 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
括号 with 的使用defined
是可选的;我更喜欢使用它们来增加清晰度。
#ifdef是#if defined的缩写,我认为你不需要括号,所以基本上它们是相同的。
来自 Turbo C,我习惯于查看#ifdef而不是#if defined
本来只有一个#ifdef
,但是#if
来的时候必须要有defined()
才能#if
超集#ifdef
。