foward typedef结构

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)

我只是想知道如何转发声明并能够将结构作为参数传递?

非常感谢任何建议,

Geo*_*che 7

你应该使用:

int initialize_ports(struct struct_tag *port);
                     ^^^^^^
Run Code Online (Sandbox Code Playgroud)

此外,前向声明会为您提供一个不完整的类型,您不知道它的大小.如果需要分配struct struct_tag,则需要包含完整定义.或者,create_struct_tag()如果要使其完全不透明,可以使用某些功能.


psm*_*ars 5

至于其他的答案已经指出的那样,你可以改变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)

即创建和释放结构 - 实际上也用于其他操作(例如读取/写入结构).