在foo.h中我有:
struct Foo_st {
int a;
MyObj obj1, obj2;
};
typedef struct Foo_st* Foo;
在foo.c
内,我想为struct
分配空间,所以我尝试了:
Foo foo1 = (Foo) malloc(sizeof(Foo_st));
但是我收到了错误 -
' Foo_st'未申报(首次使用此功能)
我做错了什么?
答案 0 :(得分:2)
在C中,结构名称必须以struct
开头。你想要:
Foo foo1 = malloc(sizeof(struct Foo_st));
或者,将您的struct Foo_st
声明替换为typedef:
typedef struct {
int a;
MyObj obj1, obj2;
} Foo_st;
这将Foo_st
定义为匿名struct
类型的别名。然后,您的原始分配声明将起作用。
答案 1 :(得分:1)
您必须 typedef struct
才能使用struct
关键字,就像使用typedefed指针一样:
typedef struct {
int a;
MyObj obj1, obj2;
} Foo_st;
typedef Foo_st* Foo;
// note: ^^^^^^^^ there is no struct keyword as Foo_st is already
// a typedef for struct, i.e. struct Foo_st
Foo foo1 = malloc(sizeof(Foo_st));
注意:无需在C中投射malloc。
答案 2 :(得分:0)
您的代码在C中失败,因为未定义类型Foo_st
(与C ++相反)。
您可以通过3种不同方式纠正此问题:
添加struct
关键字:
Foo foo1 = malloc(sizeof(struct Foo_st));
定义类型Foo_st
:
typedef struct Foo_st {
int a;
MyObj obj1, obj2;
} Foo_st;
typedef struct Foo_st *Foo;
Foo foo1 = malloc(sizeof(Foo_st));
使用目标指针的类型(更安全的选项IMHO):
Foo foo1 = malloc(sizeof(*foo1));
请注意,隐藏typedef后面的指针被认为是不好的方式。它往往容易出错,并且会产生非惯用代码,使读者和程序员都感到困惑。