2014-11-25 57 views
0

在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文件包含定义。

+1

库供应商应该提供自己,运头向前声明具有稳定的typedef名称。然后供应商可以改变内心的名字,让她心中高兴,你永远不会知道。 – 2014-11-25 11:34:02

回答

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 */ 
+0

这似乎是最好的方法。创建一个只需转发的头部即可声明结构,以便可以使用一致的前向声明。所以只有真正需要的头文件必须包含结构定义及其所有的依赖关系。 – 2014-11-25 12:26:46

+0

获得不透明指针的好方法。比使用'void *'更好,因为这样你就可以保持强大的输入。 – 2014-11-25 13:01:56