0

構造体メンバーを制御し、プログラマーにゲッター/セッター関数を使用させるために、次のパターンのようなコードを記述したいと思います。

/* 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ではコンパイルされません。

コンパイルするにはどの変更を行う必要がありますか?

注:私は、C99やC ++ではなく、ANSI-C(C89)標準を使用しています。

4

2 に答える 2

4

make_pointpoint.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ます。


(*)これは、struct pointと呼ばれる型を宣言するc++とは異なることに注意してください。pointstruct

于 2012-04-08T21:37:01.597 に答える