2011-12-07 5 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으로 컴파일하십시오.

업데이트

감사합니다 - 동시에 세 가지 더보기 간략히 해당 답변, 나는 그들 중 하나를 선택할 수 있었다.

그래서이 문제를 해결할 때 어떤 선택을해야합니까? 첫째, 명명 규칙 - _ttypedef 또는 _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; 

답변

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;