ant*_*009 4 c struct typedef forward-declaration
gcc 4.4.4 c89
Run Code Online (Sandbox Code Playgroud)
我在头文件中有这个.
port.h
struct struct_tag;
int initialize_ports(struct_tag *port);
Run Code Online (Sandbox Code Playgroud)
在我的实现文件中,我有这个:
port.c
typedef struct struct_tag {
int port_id;
} Port_t;
Run Code Online (Sandbox Code Playgroud)
在我的driver.h文件中,我有以下内容:
#include "port.h"
int initialize_ports(struct_tag *port)
{
port = malloc(sizeof *port);
/* do checking here */
}
Run Code Online (Sandbox Code Playgroud)
我已经向前声明了结构,因为我想隐藏内部元素.
但是,我在头文件中的initialize_ports上收到以下错误:
expected ‘)’ before ‘*’ token
Run Code Online (Sandbox Code Playgroud)
我只是想知道如何转发声明并能够将结构作为参数传递?
非常感谢任何建议,
你应该使用:
int initialize_ports(struct struct_tag *port);
^^^^^^
Run Code Online (Sandbox Code Playgroud)
此外,前向声明会为您提供一个不完整的类型,您不知道它的大小.如果需要分配struct struct_tag,则需要包含完整定义.或者,create_struct_tag()如果要使其完全不透明,可以使用某些功能.
至于其他的答案已经指出的那样,你可以改变struct_tag,以struct struct_tag原型.让代码编译的另一种方法是编写
typedef struct struct_tag struct_tag;
Run Code Online (Sandbox Code Playgroud)
代替现有的struct struct_tag;(即将typedef与前向定义结合起来).那确实允许你写
int initialize_ports(struct_tag *port)
Run Code Online (Sandbox Code Playgroud)
没有编译失败.但是,这仍然不是你想要的,因为调用者既不能分配这种类型的局部变量,也不能分配malloc(),因为它们不知道大小.
其他答案表明你应该打开结构的定义.这通常不是正确的答案 - 因为它删除了您尝试创建的抽象层.要好得多具备的功能(在port.c,即库不知道的内部),如:
struct_tag *create_port(...);
void free_port(struct_tag *port)
Run Code Online (Sandbox Code Playgroud)
即创建和释放结构 - 实际上也用于其他操作(例如读取/写入结构).