C 使用两个头文件定义不透明类型?
考虑以下代码: 标题.hC 使用两个头文件定义不透明类型?,c,C,考虑以下代码: 标题.h typedef struct foo_tag__ foo; int do_something(foo data); struct foo_tag__ { /* Some fields go here. */ int foo1; int foo2; double some_value; }; private.h typedef struct foo_tag__ foo; int do_something(foo data);
typedef struct foo_tag__ foo;
int do_something(foo data);
struct foo_tag__
{
/* Some fields go here. */
int foo1;
int foo2;
double some_value;
};
private.h
typedef struct foo_tag__ foo;
int do_something(foo data);
struct foo_tag__
{
/* Some fields go here. */
int foo1;
int foo2;
double some_value;
};
程序.c
#include "header.h"
#include "private.h"
int main()
{
/* Do something */
return(0);
}
现在当我这样做的时候,我会发现到处都是错误。那么,可以使用两个不同的头文件定义不透明类型吗?一个是公共的,另一个是私有的,不在include目录中
编辑:根据额外的研究,我选择使用void*指针来为库提供不透明的接口。这个问题可以结束了。此外,链接的问题虽然类似,但与我试图在一个头文件中定义不透明类型,然后在另一个头文件中填写定义不同,因为它在多个文件中使用。此外,链接的问题没有标记答案。可能重复的我不认为这是重复的,因为我想在两个头文件中定义不透明类型,其中header.h是公共文件,private.h是实际定义。该定义不在program.c的实现中。这与您链接的内容稍有不同。除非包含private.h,否则您不能使用
do\u something
,但这样您的类型就不再是不透明的。这是因为编译器需要生成代码,将传递给do\u something
的foo
参数复制到它接收到的本地参数;只有当它知道foo
的大小时才能这样做,而当结构被前向声明但没有定义时,它就不能这样做。因此,不透明类型需要使用不透明指针。所以是一样的;当你试图隐藏foo
的定义时,它是不相关的,没有它,你就不能声明foo
类型的变量或传递type
foo类型的参数。不管怎样,这是一个没有实际意义的问题,因为我选择使用void指针来解决这个问题。