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...)
问题:以下代码片段编译良好(其中两种结构类型都已定义类型):
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...)