C 使用两个头文件定义不透明类型?

C 使用两个头文件定义不透明类型?,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);

考虑以下代码:

标题.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);
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指针来解决这个问题。