C:下标一个不完整类型的数组是合法的吗?

Sub*_*ent 6 c extern incomplete-type

我找不到标准中的相关位,但是gcc和clang允许它,所以我想我想知道它是编译器扩展还是语言的一部分.如果可以,请提供链接.

这可以通过以下方式产生:

extern char arr[];

func(arr[7]); /*No error.*/
Run Code Online (Sandbox Code Playgroud)

晚编辑:我想我最好能清楚地理解这一点,虽然我已经继续前进,但我从未做过这样的事情,所以我将奖励给第一个给我一个明确,简明的参考资料的人.关于为什么允许这样做的C89标准.如果没有人能在C89中找到答案,C99是可以接受的,但您需要先查看C89标准.

Lee*_*hem 4

以下声明

\n\n
extern char arr[];\n
Run Code Online (Sandbox Code Playgroud)\n\n

是一个具有外部链接的声明,表示arr具有 的 数组类型char,这意味着arr可以具有不完整的类型。

\n\n

根据“6.7 声明”(n1570):

\n\n
\n

7 如果对象的标识符声明时没有链接,则该对象的类型应在其声明符末尾处完成,或者在其 init 声明符末尾处(如果它有初始化器);对于函数参数(包括原型),需要完整的是调整后的类型(参见 6.7.6.3)。

\n
\n\n

arr[7]equals *(arr + 7),并且需要有一个“指向完整对象类型的指针”类型,并且在这种情况下,arr类型arr将从“数组”转换char为“指向”的指针。char

\n\n

根据“6.3.2.1 左值、数组和函数指示符”(n1570):

\n\n
\n

3 除非它是运算sizeof符、_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则具有\n 类型\xe2\x80\x98\xe2\x80\ 的表达式x98类型为\xe2\x80\x99\xe2\x80\x99的数组被转换为类型为\xe2\x80\x98\xe2\x80\x98的表达式,指向类型为\xe2\x80\x99\xe2\x80\x99的指针到数组对象的初始元素并且不是左值。

\n
\n