C: "array type has incomplete element type" 当使用不带 typedef 的结构数组时

C: "array type has incomplete element type" when using array of struct without typedef

问题:以下代码片段编译良好(其中两种结构类型都已定义类型):

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 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”的类型定义,我会得到一个额外的错误: "field 'c' has incomplete type"

问题:为什么会这样?在这里使用 typedef 是绝对必要的吗?在我的代码中,我从不对结构类型使用 typedef,所以我正在寻找一种方法来避免这种情况,如果可能的话。

如果删除 typedef,则需要添加结构标签:struct outside_struct { ... };

在此声明中

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;
};

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...)