起因
嘗試在c中模仿c++的類,把成員函數放置到結構體中。顯然只能放置一個結構體指針。
于是準備這么做。
錯誤示范
typedef struct {int id;void(*show)(Person p);
}Person;void showPerson(Person p){
//....
}void init(Person * p){p->show = showPerson;
}
運行結果:
錯誤 C2224 “.show ”的左側必須具有結構/聯合類型
以及一大堆亂七八糟的語法錯誤
錯誤原因
如果你這個結構體是使用 typedef + 無名結構體定義的,然后結構體內部又用到了自身這個結構體的類型,并且你直接使用 定義的別名作為類型,就會報錯。
上面代碼中:
void(*show)(Person p);
這里的 Person 實際是typedef定義出來的別名。
但是目前是在結構體內部使用,還沒有解析到typedef,顯然別名此時不生效了
解決辦法
typedef 定義時,不要定義無名結構體,而是起個名字,名字和別名一樣
然后內部使用這個結構體類型時,使用 struct 結構體名
示例:
typedef struct Person {int id;void(*show)(struct Person p);
}Person;
這樣就沒問題了