如何声明外部 typedef 结构体?

7

我有两个c文件,一个是具有功能的foo.c,另一个是用于测试foo.c函数的test_foo.c。

是否有一种方法可以在不使用头文件的情况下在test_foo.c中访问我在foo.c中定义的结构typedef BAR?到目前为止,我已经能够避免使用h文件,以便整个程序只由foo.c组成。谢谢。

foo.c   
typedef struct BAR_{...} bar;
BAR *bar_new(...) {..}

test_foo.c
extern BAR *bar_new(...)

错误:在‘BAR’之前缺少声明说明符或‘...’

3个回答

6
答案是有一个,而且你应该使用头文件。你可以将结构体的定义 typedef struct BAR_{...} bar; 复制到test_foo.c,这样它就能运行了。但这会导致冗余。任何有效的解决方案都必须使编译器在test_foo.c中可用于实现 struct。 如果适合这种情况,你也可以使用 ADT。

1
只有当test_foo.c(或任何其他在foo.c之外的模块)需要访问结构体本身时,将定义移动到头文件是正确的解决方案。如果它是一个ADT或由于某些其他原因test_foo.c不需要类型的内部,则我认为前向声明是更好的解决方案。 - harald
1
目前,我只是将定义复制到了另一个C文件中。 - Framester
我正在做同样的事情 - 我正在开发一个测试工具,它应该包装生产代码。在生产代码中,结构定义不应该是公共的,而应该被隐藏起来。因此,我不得不将定义复制到我的测试工具中。这是重复的,但我的链接器足够聪明,如果其中一个更改了,它会给我警告,但不会影响另一个。 - Nick

4

取消typedef。

在foo.c中:

struct bar 
{
    ...
};

struct bar *bar_new(....)
{
    return malloc(sizeof(struct bar));
}

在test_foo.c文件中:

struct bar;

struct bar *mybar = bar_new(...);

请注意,这种方法只会让你知道结构体bar对象的存在,test_foo.c文件中的用户不知道对象的内容。

你可以在foo.c中保留typedef并将其转换为void。 - Nick

1

你需要在 test_foo.c 中提供 BAR 的定义。是否使用头文件来避免重复定义,由你决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接