如何在包含文件中部分声明typedef的结构

时间:2012-03-15 17:24:05

标签: c include typedef

我正在尝试将#include文件的相互依赖性降至最低。

在xxx.h中我有:

struct my_struct;  // partial decl to satisfy use of my_struct*
void funct(struct my_struct* ms);  // uses the partial def

如何使用typedef'd结构进行类似的部分decl? 我在第三个#include中有一个实际的decl(看起来像yyy.h):

typedef struct my_data_s {
  int ival;
  ... struct's other components ...
} my_data_t;

我只想在xxx.h中引用一个代表性的decl来引用typedef:

typedef struct my_data_s  my_data_t;  // actual full decl is elsewhere
void funct2(my_data_t* md);   

此尝试导致“重新定义typedef my_data_t”错误。 (使用gcc 4.4.3 / Ubuntu 10.4)其他随机搜索尝试(例如,向typedef添加'{}'也会出错。

我知道编译器只需要知道函数需要一个指针,所以看起来这应该是可能的。到目前为止,没有发现任何可以编译错误/警告的内容。

我看了其他问题和答案,找不到解决这个问题。好像应该有一个众所周知的方法(?!)(我知道每当我#include xxx.h时我都可以#include yyy.y - 试图避免这种依赖。)谢谢。

3 个答案:

答案 0 :(得分:3)

您是否尝试过这种简单的方法:?

xxx.h

struct my_data_s;
typedef struct my_data_s my_data_t;

yyy.h

#include "decl.h"
struct my_data_s {
   int foo;
};

答案 1 :(得分:3)

C99不允许重复typedef,C11会重复。

只需执行一次typedef并始终先拥有它:

typedef struct my_data  my_data;

也无需为struct代码和typedef标识符选择不同的名称。

答案 2 :(得分:0)

这是我们小组决定做的事情。它代表了几个相互冲突的要求/愿望的妥协。我发帖是为了展示另一种方法,因此该帖子的读者可以选择多种多样。它代表了我们情况的最佳答案。

obj_a_defs.h

// contains the definition
// #include'd only by other .h files
...
#define ... // as needed for struct definition
...
typedef struct obj_a {
  ...
} obj_a;

obj_a.h

// contains the 'full info' about obj_a: data and behaviors
// #include'd by other .c files
...
#include "obj_a_defs.h"
...
// declares functions that implement 
// the behaviors associated with obj_a

obj_a.c

...
#include "obj_a.h"
...
// implementations of functions declared in obj_a.h

obj_b.h

// a 'user' of obj_a that uses obj_a as arg
#include "obj_a_defs.h"  // to get the typedef    
...
int some_b_funct(obj_a* obja, ...);
...

obj_b.c

// Defines the 'contract' that this implementation
// is meeting.
#include "obj_b.h"
...
// This .c file includes obj_a.h only if it
// uses the functions defined for obj_a.
// If obj_a is used only to 'pass through'
// to other modules, there's no need for 
// this include.
#include "obj_a.h"  // only if obj_b uses 
...
// obj_b's function implementations

理由/条件

  • typedef和struct保持在一起
  • 使用obj_X的.c文件必须#include“obj_X.h” 显示使用
  • 一般来说,避免包含其他.h文件的.h文件; 只有'defs.h'文件在.h文件中包含#include。
  • 避免#include'文件只是为了处理依赖关系; IOW避免#include'ing obj_a.h只是因为它在obj_b.h中使用