#include<stdio.h>
#include<math.h>
int pi = sqrt(4);
当我这样来初始化全局变量的时候,编译,编译器给出了警告,并没有报错,运行结果也正确。但是书上说的是用非常量表达式来初始化一个全局变量是不合法的。我以为不合法是不符合语法规则,编译器应该会报错,但是只是警告。合法性到底应该怎么去理解?
#include<stdio.h>
#include<math.h>
int pi = sqrt(4);
当我这样来初始化全局变量的时候,编译,编译器给出了警告,并没有报错,运行结果也正确。但是书上说的是用非常量表达式来初始化一个全局变量是不合法的。我以为不合法是不符合语法规则,编译器应该会报错,但是只是警告。合法性到底应该怎么去理解?
编译器经常给语言加一些“扩展”,已提供一些非标准的功能。上面就是一例。
gcc 里,可以通过 --std 来指定所使用的标准,现在(gcc5.5; gcc6.5; gcc7.4; gcc8.3; gcc9.2)的默认值是 gnu11,也就是 C11 with GNU extensions ,C11 加 GNU 扩展。
gcc 里,如果希望与标准完全一致的行为,可以用
--std=c11 -pedantic-errors
。这样任何扩展功能都会被拒绝。扩展功能,在一个编译器里能够通过编译,不一定在其它编译器也可以。不同编译器提供的扩展并不相同。
========
补充一句:
C11 标准里明确写了:
只要不改变严格符合标准的程序的行为,允许编译器添加扩展。上面的扩展就是属于这一类。
标准同时要求实现以文档形式说明它的扩展。gcc 的 C 扩展的文档:Extensions to the C Language Family