在C语言中,假设我在文件gulp.start
中定义struct s
。我不希望其他人访问此f.c
,因此我不会将其放在struct
中。在我的项目中,我还有许多其他文件,包括f.h
,希望访问g.c
中的struct s
。
有没有办法让这成为可能?我认为f.c
必须是s
中声明的全局extern
变量。他们会在编译期间链接。我不确定这是否可行,或者是否正确/最好的方式来做这样的事情。
答案 0 :(得分:4)
您可以向头文件添加类型的前向声明,并且可以将其视为不透明(不完整)类型。
struct s;
其他人现在可以引用struct s *
,但他们无法使用struct s
,因为该类型不完整。
如果您提供API,他们可以调用API来创建,修改和销毁struct s
的实例。
enum struct_s_field {
S_FIELD_NAME,
S_FIELD_VALUE,
/* ... */
};
struct s * make_s ();
void unmake_s(struct s *);
void update_s(struct s *, enum struct_s_field, ...);
答案 1 :(得分:1)
执行此操作的一种方法是在f.c
中创建初始化,读取和写入struct s
结构的API。要从调用者隐藏此结构的内容,请将void *
返回给它在后续调用f.c
API时使用的调用者。
例如:
void *pS;
pS = sInit();
void *sInit(void)
{
return malloc(sizeof(struct s));
}