4

これがケースです。私が持っているファイル「fileA.c」に

typedef struct MY_STRUCT
{
  int A;
  int B;
  int C;
}MY_STRUCT;

MY_STRUCT Data;

/* Function */
int function(MY_STRUCT *params)
{
  int varA, varB, varC;

  varA = params->A;
  varB = params->B;
  varC = params->C;
}

そして、他のルーチンから構造体要素を埋める必要があります。たとえば、次の内容を含む「fileB.c」です。

extern MY_STRUCT Data;

int function(MY_STRUCT *params);

/* Function  */
void userMain(void)
{
  Data.A = 1254;
  Data.B = 5426;
  Data.C = 1236;

  function(&Data);
}

しかし、私はエラーが発生しています:

"[エラー] fileB.c E208: 構文エラー - トークン ";" が "Data" の前に挿入されました

エラーをクロス プローブすると、コンパイラは "extern MY_STRUCT Data;" という宣言に移動します。

私の質問は、この機能をどのように達成するのですか? つまり、構造体を宣言したファイルとは別のファイルにある別の関数の構造体の要素をどのように埋めるのですか?

4

2 に答える 2

5

コンパイラが fileB.c をコンパイルしているとき、fileA.ctypedef定義したことを知りません。したがって、fileB.c では、不明なタイプです。MY_STRUCT

を共通ヘッダーに移動しtypedef、fileA.c と fileB.c にインクルードする必要があります。

于 2012-08-14T17:04:27.630 に答える
1

@ pb2qの回答について少し詳しく説明します。

(定義などを省略して) filea.h ファイルを作成します。

struct MY_STRUCT
{
(blah blah blah ...)
};

extern MY_STRUCT Data;

これにより、構造体が宣言され、変数が別のファイルで宣言されていることを知りたい人に通知されます。次に、filea.c に次の行を入れます。

#include "filea.h"     // near the top
(...)
MY_STRUCT Data;    // Somewhere meaningful

これにより、実際に変数 Data が宣言されます。最後に、ファイル「fileb.c」タイプで

#include "filea.h"

これにより、変数 Data を使用できるようになります。

于 2012-08-14T18:34:25.077 に答える