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标准.
以下声明
\n\nextern char arr[];\nRun Code Online (Sandbox Code Playgroud)\n\n是一个具有外部链接的声明,表示arr具有 的 数组类型char,这意味着arr可以具有不完整的类型。
根据“6.7 声明”(n1570):
\n\n\n\n\n7 如果对象的标识符声明时没有链接,则该对象的类型应在其声明符末尾处完成,或者在其 init 声明符末尾处(如果它有初始化器);对于函数参数(包括原型),需要完整的是调整后的类型(参见 6.7.6.3)。
\n
而arr[7]equals *(arr + 7),并且需要有一个“指向完整对象类型的指针”类型,并且在这种情况下,arr类型arr将从“数组”转换char为“指向”的指针。char
根据“6.3.2.1 左值、数组和函数指示符”(n1570):
\n\n\n\n3 除非它是运算
\nsizeof符、_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的指针到数组对象的初始元素并且不是左值。