gpt4 book ai didi

c - 为什么我无法完成数组类型的 typedef 名称?

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

C 标准规定(§6.2.5 p22):

An array type of unknown size is an incomplete type. It is completed, for an identifier of that type, by specifying the size in a later declaration (with internal or external linkage).

就变量声明而言,它工作正常:

int a[];
int a[2]; //OK

但是当我们在这些声明之前添加 typedef 时,编译器会报错(我也更改了名称):

typedef int t[];
typedef int t[2]; //redefinition with different type

然而,当我们将 typedef 完成为不完整的结构时,它并没有提示:

typedef struct t t1;
typedef struct t { int m; } t1; //OK

不完整的 typedef 数组的可能用例可能是这样的:

int main(int n, char **pp)
{
typedef int t1[][200];
typedef struct t { t1 *m; int m1; } t0;
typedef int t1[sizeof (t0)][200];
}

在上面的示例中,我想在一个结构中声明一个指向数组的指针,该结构的元素数量等于结构大小。是的,我可以使用结构而不是数组,但当上述选项可能可用时,我为什么要这样做?

最佳答案

typedef int t[2]; 由于约束 6.7/3 不允许:

If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space, except that:

  • a typedef name may be redefined to denote the same type as it currently does, provided that type is not a variably modified type;

但是 int[]int[2] 不是同一类型,所以这个“except”不适用,因此代码违反了约束。


关于您的第一句话:尽管 6.2.5/22 说可以完成不完整的类型,但这并不意味着任何尝试的完成都自动合法。尝试完成还必须遵守语言的所有其他规则,在这种情况下它不符合 6.7/3。

int a[]; int a[2]; 示例是可以的(在 6.7/3 下),因为 a 有链接;并且在 typedef struct t t1; 中,struct t 在完成前后仍然是同一类型。

关于c - 为什么我无法完成数组类型的 typedef 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195584/

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