2010-07-12 313 views
6

我有两个c文件,具有功能的foo.c和测试foo.c的功能的te​​st_foo.c。如何声明extern typedef结构体?

有没有办法访问struct typedef BAR我在test_foo.c中的foo.c中定义的,而不使用头文件?到目前为止,我能够避免一个h文件,因此整个程序将由foo.c组成。谢谢。

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

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

error: expected declaration specifiers or ‘...’ before ‘BAR’

回答

6

答案是有一个,你应该使用头文件来代替。 您可以将结构typedef struct BAR_{...} bar;的定义复制到test_foo.c,它将起作用。但是这会导致重复。 每个工作的解决方案都必须使test_foo.c中的编译器可用的结构体实现。 如果在这种情况下适合您,也可以使用ADT。

+1

只有在test_foo.c(或foo.c以外的任何其他模块)需要访问内容结构本身时,将定义移动到头文件才是正确的解决方案。如果是ADT或其他原因,test_foo.c不需要类型的内部消息,我认为前向声明是更好的解决方案。 – harald 2010-07-12 10:42:47

+1

现在,我只是将定义复制到其他c文件中。 – Framester 2010-07-12 12:48:30

+0

我正在做同样的事情 - 我正在开发一个测试工具,应该包装生产代码。在生产守则中,结构定义没有公开的业务,应该被埋没。因此我必须将定义复制到我的测试工具中。这是重复的,但我的链接器足够聪明,可以给我警告,如果一个变化,而不是另一个。 – Nick 2014-12-03 23:35:51

1

您将需要供电条的定义test_foo.c。重复是否优于标题取决于您。

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(...); 

请注意,你只能得到一个结构条物体的存在,这样,在test_foo.c用户不知道对象的内容。

+0

你可以保留typedef,然后在foo.c中将其强制转换为void。 – Nick 2014-12-03 23:29:00