如何在头文件中定义和使用没有完整结构定义的结构?

时间:2012-04-08 21:28:20

标签: c struct c89 design-guidelines

为了控制struct成员并强制程序员使用getter / setter函数,我想编写如下代码的代码:

/* Header file: point.h */
...
/* define a struct without full struct definition. */
struct point;

/* getter/setter functions. */
int point_get_x(const struct point* pt);
void point_set_x(struct point* pt, int x);
...

//--------------------------------------------

/* Source file: point.c */
struct point
{
  int x, y;
};

int point_get_x(const struct point* pt) {return pt->x; }

void point_set_x(struct point* pt, int x) {pt->x = x;}

//--------------------------------------------

/* Any source file: eg. main.c */

#include "point.h"
int main()
{
  struct point pt;

  // Good: cannot access struct members directly.
  // He/She should use getter/setter functions.
  //pt.x = 0;

  point_set_x(&pt, 0);
}

但是这段代码不能用MSVC ++ 2010编译。

我应该做哪些更改来编译?

注意:我使用ANSI-C(C89)标准,而不是C99或C ++。

2 个答案:

答案 0 :(得分:4)

在point.c中创建一个make_point函数来创建点; main.c不知道结构有多大。

另外

typedef struct point point;

支持在声明中使用point而不是struct point

答案 1 :(得分:3)

  point pt;

类型名称为struct point。你必须每次都使用整件事,或者你需要typedef它。 *

即。你应该写

  struct point pt;

main


您可能正在考虑标准库中的FILE*及类似内容,并希望复制该行为。为此,请使用

struct s_point
typedef struct s_point point;
标题中的

。 (编写它的方法较短,但我希望避免混淆。)这会声明一个名为struct s_point的类型,并为其指定别名point


(*)请注意,这与c ++不同,其中struct point声明了一个名为point的类型struct