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
으로 컴파일하십시오.
업데이트는
감사합니다 - 동시에 세 가지 더보기 간략히 해당 답변, 나는 그들 중 하나를 선택할 수 있었다.
그래서이 문제를 해결할 때 어떤 선택을해야합니까? 첫째, 명명 규칙 - _t
을 typedef
또는 _s
(또는 Struct
)에서 struct
으로 추가 하시겠습니까? 아마 미각의 문제. 그런 다음 typedef
의 일부로 또는 struct
의 일부로 순방향 정의를 갖고 싶은지 여부. 아마도 맛의 문제 일 수도 있습니다. 여기에 또 다른 형태의 문제와 그것을 해결하는 방법은 세 가지입니다 :
/* 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;