0

为了控制结构成员并强制程序员使用 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++。

4

2 回答 2

4

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

typedef struct point point;

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

于 2012-04-08T21:38:51.190 回答
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声明了一个名为pointwhich is a的类型struct

于 2012-04-08T21:37:01.597 回答