C tutorialに続いて、解決方法がわからない型依存関係が発生しました。これまでのところ、次のようになりました。型定義の循環依存関係を解決する
typedef long SetStringPtr(char *);
typedef long GetStringPtr(char *, long);
typedef struct {
SetStringPtr * SetString;
GetStringPtr * GetString;
} IExampleVtbl;
typedef struct {
const IExampleVtbl * lpVtbl;
DWORD count;
char buffer[80];
} IExample;
問題ありません。ここでは、このポインタを含めるように変更しています。
typedef long SetStringPtr(IExample *, char *);
typedef long GetStringPtr(IExample *, char *, long);
typedef struct {
SetStringPtr * SetString;
GetStringPtr * GetString;
} IExampleVtbl;
typedef struct {
const IExampleVtbl * lpVtbl;
DWORD count;
char buffer[80];
} IExample;
定義はお互いに循環的に依存しています。 cl.exe
コンパイラは、IExample
を使用すると、まだ宣言されていないため、多くの構文エラーを表示します。どうすれば解決できますか?
cl.exe /W4
でコンパイルします。
更新
おかげ - 3つの詳細表示を隠す同等の答えと同時に、私はそれらのいずれかを選択している可能性があります。
この問題を解決するには、どのような選択肢が必要ですか?最初に、命名規則 - _t
をtypedef
、または_s
(またはStruct
)からstruct
に追加しますか?おそらく味の問題。次に、typedef
の一部として、またはstruct
の一部としてフォワード定義を使用するかどうかを指定します。おそらく味の問題です。ここでは別の形で問題とそれを解決するには、次の3つの方法があります:
/* won't compile */
typedef struct {
B * b;
C * c;
} A;
typedef struct {
A * a;
C * c;
} B;
typedef struct {
A * a;
B * b;
} C;
まず解決策:
struct B_s;
struct C_s;
typedef struct {
struct B_s * b; // typedef not available yet
struct C_s * c; // ditto
} A;
typedef struct {
A * a;
struct C_s * c; // ditto
} B;
typedef struct {
A * a;
B * b;
} C;
第二の溶液:
typedef struct B_s B;
typedef struct C_s C;
typedef struct {
B * b;
C * c;
} A;
// typedef struct ... B => change to:
struct {
A * a;
C * c;
} B_s;
// typedef struct ... C => change to:
struct {
A * a;
B * b;
} C_s;
そして第三に(最も対称)ソリューション:
struct A_s;
struct B_s;
struct C_s;
typedef struct A_s A;
typedef struct B_s B;
typedef struct C_s C;
struct {
B * b;
C * c;
} A_s;
struct {
A * a;
C * c;
} B_s;
struct {
A * a;
B * b;
} C_s;