2010-03-01 173 views
2

我在C++新,如何做以下工作代碼(編譯沒有語法錯誤)?typedef結構問題

typedef struct _PersonA{ 
    char name[128]; 
    LPPersonB rel; 
}PersonA, *LPPersonA; 

typedef struct _PersonB{ 
    char name[128]; 
    LPPersonA rel; 
}PersonB, *LPPersonB; 

請不要問我爲什麼我需要這樣做,因爲這只是一個例子來解釋我的問題。

+3

使用的typedef指針是普遍不好,很不好。 – Phong 2010-03-01 05:59:15

+0

@Phong:同意 - 例如參見http://stackoverflow.com/questions/750178/typedef-pointers-a-good-idea。 – 2010-03-01 06:04:45

回答

5

你要轉發聲明:

struct _PersonB; 

typedef struct _PersonA{ 
char name[128]; 
_PersonB* rel; // no typedef 
}PersonA, *LPPersonA; 

typedef struct _PersonB{ 
char name[128]; 
LPPersonA rel; 
}PersonB, *LPPersonB; 

這就是說,這是非常醜陋...。首先,有沒有必要在C++中的typedef:

struct PersonB; 

struct PersonA 
{ 
    char name[128]; 
    PersonB* rel; 
}; 

struct PersonB 
{ 
    char name[128]; 
    PersonA* rel; 
}; 

其中也有擺脫你的壞名的副作用:_PersonA。這個名字是爲編譯器保留的,因爲它以一個下劃線和一個大寫字母開頭。

就是這樣。順便說一句,在typedef背後隱藏指針通常被認爲是不好的。當您聲明thestruct PERSONA

+0

@gman:這不能編譯,你需要在struct personA的定義中放入struct _PersonB。 – Phong 2010-03-01 05:58:45

+0

@Phong:錯字。另外,你的意思是指針嗎?那是我的錯字。 – GManNickG 2010-03-01 05:59:49

+0

它給我:錯誤1個錯誤C2079:「_PersonA ::相對」使用了未定義的結構「_PersonB」 – complez 2010-03-01 06:01:28

3

LPPersonB沒有定義。你必須使用這個指針:

// declare this so the compiler know that struct _PersonaB exist (even if it does not know its implementation) 
typedef struct _PersonaA PersonaA; 
typedef struct _PersonaB PersonaB; 

// define PersonaA 
struct _PersonA{ 
    char name[128]; 
    PersonB *rel; // does not need to know personB implemenation since it is a pointer 
} ; 

// define PersonA 
struct _PersonB{ 
    char name[128]; 
    PersonA *rel; 
}; 
1

有幾種方法。其一是:

typedef struct _PersonA PersonA, *PtrPersonA; 
typedef struct _PersonB PersonB, *PtrPersonB; 

struct _PersonA { 
    char  name[128]; 
    PtrPersonB rel; 
}; 

struct _PersonB { 
    char   name[128]; 
    PtrPersonA rel; 
}; 

另一個原因是:

struct _PersonA { 
    char    name[128]; 
    struct _PersonB *rel; 
}; 

struct _PersonB { 
    char    name[128]; 
    struct _PersonA *rel; 
}; 
+0

Conistency v PtrPersonB?我怎麼記得哪個指針是大寫的? – 2010-03-01 06:06:41

+1

我的一個無意的錯字。我修復了它。 – wallyk 2010-03-04 05:48:03