在C语言中,经常对结构进行类型化以避免在任何地方编写结构。
在标题中使用此名称作为不透明指针参数时,您必须转发声明它们。整个typedef必须重复是相当烦人的。
示例:
某些标题定义了一些类型:
typedef struct sBlaBlaFooBar{
int someData;
}BlaBlaFooBar;
其他一些标头使用此结构作为指针参数。但是为了避免巨大的包含依赖关系,不应该包含BlaBlaFooBar.h,只使用前向声明。
所以你必须写typedef struct sBlaBlaFooBar BlaBlaFooBar;
来转发声明它。
这让我感到困扰的是我必须知道结构的标签名称的冗余,因为通常它并不重要。如果它被更改,即使typename相同,也必须更改所有前向声明。
这有什么聪明的方法吗?
更详细的解释:
BlaBlaFooBar
结构是所有这些结构的组合。NewStruct
和函数NewStruct_create(NewStruct* out, const BlaBlaFooBar* in);
的模块
以上结构作为输入。这些头文件只需要typedef,只有实现必须知道确切的BlaBlaFooBar
结构定义。NewStruct
的附加模块,如果BlaBlaFooBar
发生更改,则无需重新编译。因此,为了避免这种依赖关系,必须在头文件中向前声明结构,并且c文件包含定义。
答案 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 */