3

这些指令之间有什么区别(如果有的话)?

#ifdef FOO

#if defined FOO

#if defined(FOO)

我正在使用 CCS 编译器,但我也对其他C编译器感兴趣。

4

4 回答 4

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 -运行交流
没有。
$ tcc -DBAR -运行 ac
没有。
$ tcc -DFOO -DBAR -运行 ac
富吧!

此外,上面的程序编译得很好,gcc -Wall -ansi a.c因此表明#if definedANSI C 是正确的。此外,1987 年的这个 ANSI C 总结列出#if defined了 ANSI 标准下预处理器的新定义行为——这应该是您将使用的任何符合 ANSI 的编译器的标准.

如果您不使用#if defined,则必须这样做

#ifdef FOO
#ifdef BAR
    printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */

此外,C 预处理器的 Redhat 手册

#if defined MACRO正好等价于#ifdef MACRO

于 2009-10-05T04:02:11.237 回答
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
    

括号 with 的使用defined是可选的;我更喜欢使用它们来增加清晰度。

于 2009-10-05T04:11:27.120 回答
1

#ifdef#if defined的缩写,我认为你不需要括号,所以基本上它们是相同的。

来自 Turbo C,我习惯于查看#ifdef而不是#if defined

于 2009-10-05T03:44:09.140 回答
1

本来只有一个#ifdef,但是#if来的时候必须要有defined() 才能#if超集#ifdef

于 2009-10-05T07:32:36.583 回答