【问题标题】:What is the difference between these compiler directives?这些编译器指令有什么区别?
【发布时间】:2009-10-05 03:36:37
【问题描述】:

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

#ifdef FOO

#if defined FOO

#if defined(FOO)

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

【问题讨论】:

  • 它们的拼写不同。

标签: c c-preprocessor preprocessor-directive


【解决方案1】:

据我所知,#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

【讨论】:

  • 啊,我以为可能是这样的,而我在你回答的时候正在试验它。 :-)
  • 另外,我发现 #if !defined(FOO) 与 #ifndef FOO 相同
【解决方案2】:

根据 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 的括号使用是可选的;我更喜欢使用它们来增加清晰度。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      最初只有#ifdef,但是当#if出现时,必须要有defined()才能使#if超集#ifdef

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 2016-08-19
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多