我在标准中找不到相关位,但 gcc 和 clang 允许这样做,所以我想我想知道它是编译器扩展还是语言的一部分。如果可以的话请提供一个链接。
这可能会因以下情况而出现:
extern char arr[];
func(arr[7]); /*No error.*/
后期编辑:我想我最好对此有一个清晰的了解,虽然我已经继续前进,但我从未这样做过,所以开始悬赏,我将奖励给第一个给我一个清晰、简洁的参考资料的人C89 标准解释了为什么允许这样做。如果没人能在C89中找到答案,C99是可以接受的,但你需要先看看C89标准。
以下声明
extern char arr[];
是一个具有外部链接的声明,并表示arr
有一个数组类型char
,这意味着arr
可以有不完整的类型。
根据“6.7 声明”(n1570):
7 如果声明一个对象的标识符时没有链接,则该对象的类型应为
在其声明符的末尾完成,或者在其 init 声明符的末尾(如果它有一个)
初始化器;对于函数参数(包括原型),它是调整后的
要求完整的类型(见 6.7.6.3)。
And arr[7]
equals *(arr + 7)
, and arr
需要有一个“指向完整对象类型的指针”的类型,以及arr
将从“数组char
“到”指针char
“ 在这种情况下。
根据“6.3.2.1 左值、数组和函数指示符”(n1570):
3 除非它是sizeof
运营商,_Alignof
运算符,或
一元&
运算符,or 是用于初始化数组的字符串文字,是一个具有
type ‘‘array of type’’ 被转换为类型为‘‘pointer to type’’ 的表达式,该表达式指向数组对象的初始元素,并且不是左值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)