这些指令之间有什么区别?
#ifdef FOO
#if defined FOO
#if defined(FOO)
我正在使用CCS编译器,但我也对其他 C 编译器感兴趣。
答案 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
。