正确的位置来定义结构和typedef

时间:2016-06-05 21:10:11

标签: c struct

问题描述

我想知道在C中定义结构以通过其他源文件使用它们的“正确方法”。 想想以下结构

struct f3{
  double x;
  double y;
  double z;
};

问题

是否应在头文件或源文件中声明typedef和结构?如果在头文件中,为了符合C软件工程技术,应该在该头文件中包含哪些内容?

到目前为止我做了什么:

我可以将其放在types.h中,然后在其他源文件(struct f3)中使用#include types.h,也可以将其放在源文件type.c中。

2 个答案:

答案 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);