为了控制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 ++。
答案 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
。