【发布时间】:2009-10-05 03:36:37
【问题描述】:
这些指令之间有什么区别(如果有的话)?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我正在使用 CCS 编译器,但我也对其他 C 编译器感兴趣。
【问题讨论】:
-
它们的拼写不同。
标签: c c-preprocessor preprocessor-directive
这些指令之间有什么区别(如果有的话)?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我正在使用 CCS 编译器,但我也对其他 C 编译器感兴趣。
【问题讨论】:
标签: c c-preprocessor preprocessor-directive
据我所知,#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 -运行交流
没有。
$ tcc -DFOO -DBAR -运行 a.c
富吧!
此外,上述程序与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。
【讨论】:
根据 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 defined 的缩写,我认为你不需要括号,所以基本上它们是相同的。
来自 Turbo C,我习惯于查看 #ifdef 而不是 #if defined
【讨论】:
最初只有#ifdef,但是当#if出现时,必须要有defined()才能使#if超集#ifdef。
【讨论】: