Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以用这个非法的C语句编译而没有任何错误?_C_Arrays - Fatal编程技术网

为什么我可以用这个非法的C语句编译而没有任何错误?

为什么我可以用这个非法的C语句编译而没有任何错误?,c,arrays,C,Arrays,我在学习中遇到了这条线: 数组初始值设定项完全为空是非法的。所以我们必须在大括号内放一个0 但是当我编译并运行一个完全空的数组时,里面什么都没有,只有大括号,比如inta[]={}它编译并运行良好。编译器可以扩展该语言。有些默认情况下使用它们的扩展,但它们通常允许您指定特定的标准。在GCC中,您可以使用-std=XXX参数来实现这一点。例如,-std=c17强制编译器遵守C2017标准 但是,即使您发出-std标志,标准中仍有一些编译器将忽略的内容。你的例子就是这样。GCC和clang都将拒绝抱

我在学习中遇到了这条线:

数组初始值设定项完全为空是非法的。所以我们必须在大括号内放一个0


但是当我编译并运行一个完全空的数组时,里面什么都没有,只有大括号,比如
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