这些编译器指令有什么区别?

Jea*_*dar 3 c c-preprocessor preprocessor-directive

这些指令之间的区别是什么?

#ifdef FOO

#if defined FOO

#if defined(FOO)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*off 9

从我所看到的,主要用途#if defined是在一行上检查多个宏定义.否则,对于单宏定义条件,据我所知它们是相同的.

#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
    printf("foobar!\n");
#else
    printf("nothing.\n");
#endif
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ 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 */
Run Code Online (Sandbox Code Playgroud)

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

#if defined MACRO恰恰相当于#ifdef MACRO.