#if是否将未定义的符号常量假设为0是标准的?

Eig*_*ght 13 c gcc c-preprocessor

在这个c计划中

#include<stdio.h>
int main()
{

        #if UnDefinedSymbolicConstant==0
                printf("UnDefinedSymbolicConstant is equal to 0\n ");
        #else
                printf("UnDefinedSymbolicConstant is not equal to 0\n");

        #endif
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

UnDefinedSymbolicConstant不在#define任何地方,仍被假定为0并将输出打开gcc-4.3.4 为:

UnDefinedSymbolicConstant is equal to 0
Run Code Online (Sandbox Code Playgroud)

那么, 这是标准的行为还是只在gcc中才这样?

R..*_*R.. 13

是的,这由6.10.1中的标准规定:

在由于宏扩展和已定义的一元运算符执行的所有替换之后,所有剩余的标识符(包括与关键字词法相同的标识符)将替换为pp-number 0


MvG*_*MvG 6

这是默认设置,但您可以使用-Wundefgcc选项至少为此生成警告.

`-Wundef': 只要在'#if'指令中遇到一个不是宏的标识符,在`defined'之外发出警告.这些标识符被替换为零.