typedef结构的前向声明

时间:2014-11-25 11:26:52

标签: c coding-style forward-declaration

在C语言中,经常对结构进行类型化以避免在任何地方编写结构。

在标题中使用此名称作为不透明指针参数时,您必须转发声明它们。整个typedef必须重复是相当烦人的。

示例:

某些标题定义了一些类型:

typedef struct sBlaBlaFooBar{
 int someData;
}BlaBlaFooBar;

其他一些标头使用此结构作为指针参数。但是为了避免巨大的包含依赖关系,不应该包含BlaBlaFooBar.h,只使用前向声明。

所以你必须写typedef struct sBlaBlaFooBar BlaBlaFooBar;来转发声明它。

这让我感到困扰的是我必须知道结构的标签名称的冗余,因为通常它并不重要。如果它被更改,即使typename相同,也必须更改所有前向声明。

这有什么聪明的方法吗?


更详细的解释:

  • 许多带有结构定义的标题(也可能是组合结构(只是为了显示深度依赖图))
    • s1.h
    • s2.h
    • s3.h
    • s4.h
  • 一个BlaBlaFooBar标头,其BlaBlaFooBar结构是所有这些结构的组合。
  • 具有类似拓扑(来自其他子结构)的其他结构BlaBlaBarFoo
  • 然后定义处理的新结构NewStruct和函数NewStruct_create(NewStruct* out, const BlaBlaFooBar* in);的模块 以上结构作为输入。这些头文件只需要typedef,只有实现必须知道确切的BlaBlaFooBar结构定义。
  • 仅适用于NewStruct的附加模块,如果BlaBlaFooBar发生更改,则无需重新编译。

因此,为了避免这种依赖关系,必须在头文件中向前声明结构,并且c文件包含定义。

1 个答案:

答案 0 :(得分:2)

使用2个包含文件:

<强> blabla.h

#include "light_dependencies.h"
typedef struct sBlaBlaFooBar BlaBlaFooBar;

<强> blabla_internal.h

#include "blabla.h"
#include "heavy_dependencies.h"
struct sBlaBlaFooBar {
    ...
};

<强> blabla.c

#include "blabla_internal.h"
/* Here is code which deals with the internals of the struct */

<强> usercode.c

#include "blabla.h"
/* Here is code which only passes struct pointers around */