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 的结构数组时的主要内容,如果未能解决你的问题,请参考以下文章

GCC:数组类型具有不完整的元素类型

报错storage size of ‘act’ isn’t known当使用std=c99编译struct sigaction

汉诺塔通项公式推导

当数组值为零而不是空时,c循环停止

C语言。。。。。。初学者,不要用太高深的函数,大一。。。。。。。。。..体型判断。判断某人是不是属于

二阶非线性 DE