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

#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 -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 是正确的。而且, 1987 年的 ANSI C 摘要 列表 #if defined 作为 ANSI 标准下预处理器新定义的行为——这 应该 成为您将使用的任何符合 ANSI 的编译器的标准。

如果你没有使用 #if defined, ,你必须做

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

还, Redhat C 预处理器手册

#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 是短期的#如果定义,我认为你不需要括号对双方都不利,所以他们基本上是相同的。

从Turbo C的编辑,我已经习惯看的的#ifdef 而非的的#if定义

本来也仅有#ifdef,但是当#if来了这是necessay有defined()为了#if到超集#ifdef

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top