问题描述
我想知道在C中定义结构以通过其他源文件使用它们的“正确方法”。 想想以下结构
struct f3{
double x;
double y;
double z;
};
问题
是否应在头文件或源文件中声明typedef和结构?如果在头文件中,为了符合C软件工程技术,应该在该头文件中包含哪些内容?
到目前为止我做了什么:
我可以将其放在types.h
中,然后在其他源文件(struct f3
)中使用#include types.h
,也可以将其放在源文件type.c
中。
答案 0 :(得分:6)
如果您需要在多个源文件中使用该类型,请将其放在标题中(并让每个源文件都包含它)。
如果某个类型是源文件的内部类型,请将其放在那里(没有其他人必须知道它)。
C还提供了第三种方式(它为您提供抽象类型),称为“不完整类型”。为此,您可以将struct f3 { ... };
放在源文件中,将struct f3;
放在头文件中。这使得其他文件知道该类型存在,并且他们可以使用指针struct f3
,但他们无法看到struct f3
的内部或访问其成员。
答案 1 :(得分:4)
这取决于您希望与外界分享的信息量。
假设该结构将在多个翻译单元之间共享,最直接的方法是将结构类型声明放入头文件中。它被称为完整结构声明:
struct f3{
double x;
double y;
double z;
};
第二种方法是通过不完整的结构声明来隐藏成员,有时会将其视为前向声明或opaque pointer。这样您就可以隐藏成员放置的详细信息。
header.h
struct f3;
source.c
#include "header.h"
struct f3{
double x;
double y;
double z;
};
这个表单要求公共接口中的任何函数都必须只包含参数,这些参数是指向该结构的指针,并且它们只能通过指针返回这样的结构。换句话说,您不能仅通过指针直接引用结构。例如:
double area(struct f3* point);
struct f3* makePoint(int x, int y, int z);