【发布时间】:2011-04-15 13:50:15
【问题描述】:
我有几个“.c .h”文件。 在头文件(.h)中,我定义了2个typedef struct,我们称它们为TS1和TS2。
现在,TS1 的一个成员的类型是 TS2。 我希望只有 TS1 可见。 TS2 应该被隐藏。 TS2 应该只对“.c”文件可见。
我怎样才能做到这一点?
【问题讨论】:
-
该成员是声明为指针还是结构体?
我有几个“.c .h”文件。 在头文件(.h)中,我定义了2个typedef struct,我们称它们为TS1和TS2。
现在,TS1 的一个成员的类型是 TS2。 我希望只有 TS1 可见。 TS2 应该被隐藏。 TS2 应该只对“.c”文件可见。
我怎样才能做到这一点?
【问题讨论】:
我喜欢用“-internal”后缀命名私有头文件。对于你的例子,我有
foobar.c
#include "foobar-internal.h"
#include "foobar.h"
/* functions using `struct TS1` and `struct TS2` */
.
foobar.h
#ifndef H_FOOBAR_INCLUDED
#define H_FOOBAR_INCLUDED
struct TS1;
#endif
.
foobar-internal.h
#ifndef H_FOOBAR_INTERNAL_INCLUDED
#define H_FOOBAR_INTERNAL_INCLUDED
struct TS2 { int whatever; };
struct TS1 { int whatever; struct TS2 internal; };
#endif
任何使用您的函数的代码,包括更简单的"foobar.h",并且可以使用指向struct TS1 的指针。它不能直接使用struct TS1 或struct TS2 类型的对象。事实上,通过只包含"foobar.h",代码不知道任何地方都存在struct TS2 类型,并且可以根据自己的目的重新定义它。
usercode.c
#include "foobar.h"
struct TS1 *x;
x = newTS1();
work(x);
destroyTS1(x);
【讨论】:
private不是C中的关键字。
foobar-internal.h从来没有被包含在任何地方时,编译器怎么知道TS1和TS2的定义呢?
#include "foobar-internal.h";通常是处理相关结构的源文件。
我同意 Rumple。
你可以做的是例如.h 中的#define TS2 int 和#include 之后的.c 文件顶部的#undef TS2。
虽然这不使用typedef。如果你想在多个.c文件中#include它,你也可以在.h文件底部#undef它。
【讨论】:
AFAIK,这是不可能的。但是对于 TS1 和 TS2,您可以有 2 个不同的 .h 文件。
【讨论】: