在C中,通常结构都是typedefed,以避免在任何地方编写struct。typedefed结构的前向声明
在标题中使用此名称作为不透明指针参数时,必须转发声明它们。整个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文件包含定义。
库供应商应该提供自己,运头向前声明具有稳定的typedef名称。然后供应商可以改变内心的名字,让她心中高兴,你永远不会知道。 – 2014-11-25 11:34:02