2011-12-07 13 views
1

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つの詳細表示を隠す同等の答えと同時に、私はそれらのいずれかを選択している可能性があります。

この問題を解決するには、どのような選択肢が必要ですか?最初に、命名規則 - _ttypedef、または_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; 

答えて

2
typedef struct IExample_s IExample; 

typedef long SetStringPtr(IExample *, char *); 
typedef long GetStringPtr(IExample *, char *, long); 

typedef struct { 
    SetStringPtr * SetString; 
    GetStringPtr * GetString; 
} IExampleVtbl; 

struct IExample_s { 
    const IExampleVtbl * lpVtbl; 
    DWORD count; 
    char buffer[80]; 
}; 
1

転送するにはIExample構造体を宣言します。

//Forward Declare here 
typedef struct IExample IExample_t; 

typedef long SetStringPtr(IExample_t *, char *); 
typedef long GetStringPtr(IExample_t *, char *, long); 

typedef struct { 
    SetStringPtr * SetString; 
    GetStringPtr * GetString; 
} IExampleVtbl; 

struct IExample { 
    const IExampleVtbl * lpVtbl; 
    DWORD count; 
    char buffer[80]; 
}; 
3

フォワード-宣言:

struct IExampleStruct; /* <--- !! */ 

typedef long SetStringPtr(struct IExampleStruct *, char *); 
typedef long GetStringPtr(struct IExampleStruct *, char *, long); 

/* ... */ 

typedef struct IExampleStruct { 
    const IExampleVtbl * lpVtbl; 
    DWORD count; 
    char buffer[80]; 
} IExample; 
関連する問題