gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:18:25 25 4
gpt4 key购买 nike

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

这可能会出现这样的情况:

extern char arr[];

func(arr[7]); /*No error.*/

后期编辑:我想我最好清楚地了解这一点,虽然我已经继续前进但我从未这样做过,所以开始悬赏,我将奖励给第一个给我清晰、简洁引用的人( es) 在 C89 标准中说明为什么允许这样做。如果没有人能在 C89 中找到答案,C99 是可以接受的,但您需要先查看 C89 标准。

最佳答案

下面的声明

extern char arr[];

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

根据“6.7 声明”(n1570):

7 If an identifier for an object is declared with no linkage, the type for the object shall be complete by the end of its declarator, or by the end of its init-declarator if it has an initializer; in the case of function parameters (including in prototypes), it is the adjusted type (see 6.7.6.3) that is required to be complete.

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

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

3 Except when it is the operand of the sizeof operator, the_Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

关于C: 给一个不完整类型的数组下标合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20951091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com