为什么我可以用这个非法的C语句编译而没有任何错误?
我在学习中遇到了这条线: 数组初始值设定项完全为空是非法的。所以我们必须在大括号内放一个0为什么我可以用这个非法的C语句编译而没有任何错误?,c,arrays,C,Arrays,我在学习中遇到了这条线: 数组初始值设定项完全为空是非法的。所以我们必须在大括号内放一个0 但是当我编译并运行一个完全空的数组时,里面什么都没有,只有大括号,比如inta[]={}它编译并运行良好。编译器可以扩展该语言。有些默认情况下使用它们的扩展,但它们通常允许您指定特定的标准。在GCC中,您可以使用-std=XXX参数来实现这一点。例如,-std=c17强制编译器遵守C2017标准 但是,即使您发出-std标志,标准中仍有一些编译器将忽略的内容。你的例子就是这样。GCC和clang都将拒绝抱
但是当我编译并运行一个完全空的数组时,里面什么都没有,只有大括号,比如
inta[]={}代码>它编译并运行良好。编译器可以扩展该语言。有些默认情况下使用它们的扩展,但它们通常允许您指定特定的标准。在GCC中,您可以使用-std=XXX
参数来实现这一点。例如,-std=c17
强制编译器遵守C2017标准
但是,即使您发出-std
标志,标准中仍有一些编译器将忽略的内容。你的例子就是这样。GCC和clang都将拒绝抱怨空的初始值设定项,除非您有一个-pedantic
标志。我举个例子
节目:
int main(void)
{
int arr[] = {};
return arr[0]; // this would be invalid even if the above was ok
}
汇编:
gcc t.c-标准=c17-迂腐
t、 c:在函数“main”中:
t、 c:3:14:警告:ISO c禁止使用空的初始值设定项大括号[-Wpedantic]
3 | int arr[]={};
| ^
t、 c:3:6:错误:零或负大小数组“arr”
3 | int arr[]={};
| ^~~
如果希望学究式警告变成错误,可以使用-pedantic errors
。这看起来更像是未定义的行为,而不是其他行为。绝对不是一种标准的操作方式。可能是编译器特定的扩展。是允许的
有点言过其实了-(在许多情况下)它们是不允许的,C“禁止使用空的初始值设定项大括号”。有人可能会说,以这种方式“扩展语言”的编译器不再是C编译器,因为这不再是有效的C语言。@KamilCuk:C标准明确允许扩展,只要它们不破坏严格一致的程序。空的初始值设定项大括号是一个语法错误,因此符合要求的C编译器必须发出诊断消息,但该诊断可能是一个非致命的警告。事实上,即使您指定了标准,-Wall
和-Wextra
,它也拒绝发出警告。你需要-pedantic
。