C:“数组类型具有不完整的元素类型”当使用没有 typedef 的结构数组时
Posted
技术标签:
【中文标题】C:“数组类型具有不完整的元素类型”当使用没有 typedef 的结构数组时【英文标题】:C: "array type has incomplete element type" when using array of struct without typedef 【发布时间】:2022-01-02 00:16:27 【问题描述】:问题:以下代码 sn-p 编译良好(其中两种结构类型都是 typedefed):
typedef struct
int a;
float b;
member_struct;
typedef struct
int a;
double b;
member_struct c;
outside_struct;
outside_struct my_struct_array[4];
但是,如果“outside_struct”的 typedef 被删除:
typedef struct
int a;
float b;
member_struct;
struct
int a;
double b;
member_struct c;
outside_struct;
struct outside_struct my_struct_array[4];
我得到错误:
"array type has incomplete element type 'struct outside_struct'".
如果我也删除“member_struct”的 typedef,我会得到一个额外的错误:
"field 'c' has incomplete type"
问题:为什么会这样?在这里使用 typedef 是绝对必要的吗?在我的代码中,我从不将 typedef 用于结构类型,所以我正在寻找一种方法来避免这种情况,如果可能的话。
【问题讨论】:
第二个sn-p中没有叫struct outside_struct
的类型。您有一个名为 outside_struct
的匿名结构的实例 - 它不是一种类型
【参考方案1】:
在此声明中
struct
int a;
double b;
member_struct c;
outside_struct;
声明了未命名结构类型的对象outside_struct
。没有声明名称为 struct outside_struct
的结构。
所以编译器在这个数组声明中发出错误
struct outside_struct my_struct_array[4];
因为在此声明中引入了未定义的类型说明符struct outside_struct
。也就是说,在这个声明中,类型说明符 struct outside_struct
是一个不完整的类型。
您不能声明元素类型不完整的数组。
您需要声明一个与标签名称相同的结构,而不是声明一个未命名结构的对象outside_struct
struct outside_struct
int a;
double b;
member_struct c;
;
【讨论】:
谢谢!我被编译器错误弄糊涂了,好像我没有指定结构的内部字段。 @kmalarski 完全没有。不客气。:) @kmalarski 我猜数组定义也可以作为struct outside_struct
的声明(由于 struct 关键字,它不会与结构实例 outside_struct
冲突),从这个意义上说,编译器错误是准确的,但是在不知道的情况下,确实会令人困惑!【参考方案2】:
如果你去掉 typedef,你需要添加一个结构标签来代替:struct outside_struct ... ;
【讨论】:
【参考方案3】:Typedef 用于为另一种数据类型创建附加名称(别名)。
typedef int myInt; //=>equivalent to "int"
myInt index = 0; //=>equivalent to "int index = 0;"
struct 也是一样的逻辑
typedef struct myStruct myStruct_t; //=> equivalent to "struct myStruct ;"
myStruct_t myStructVariable; //=> equivalent to "struct myStruct myStructVariable;"
syntaxe = "typedef type newAlias;"
“myStruct”是一种新类型,包含您想要的所有类型(int、char...)
【讨论】:
以上是关于C:“数组类型具有不完整的元素类型”当使用没有 typedef 的结构数组时的主要内容,如果未能解决你的问题,请参考以下文章
报错storage size of ‘act’ isn’t known当使用std=c99编译struct sigaction