3 回答

TA貢獻1864條經(jīng)驗 獲得超6個贊
這是因為,在第一個示例中,該結構先前未定義,因此編譯器嘗試將對該結構的第一個引用視為定義。
通常,C是聲明順序很重要的語言。您使用的所有內容均應事先以某種能力進行適當聲明,以便編譯器可以在其他上下文中引用它時對其進行推理。
這不是語言設計中的錯誤或錯誤。相反,我認為這是為了簡化第一個C編譯器的實現(xiàn)而做出的選擇。前向聲明使編譯器可以一次通過串行轉換源代碼(只要知道一些信息(例如大小和偏移量))。如果不是這種情況,則編譯器只要遇到無法識別的標識符,便能夠在程序中來回移動,從而要求其代碼發(fā)射循環(huán)更加復雜。

TA貢獻1820條經(jīng)驗 獲得超9個贊
編譯器警告你一個向前聲明的struct lol。C允許您執(zhí)行以下操作:
struct lol; /* forward declaration, the size and members of
struct lol are unknown */
這在定義自引用結構時最常用,但是在定義從未在頭文件中定義的私有結構時也很有用。由于存在后者,因此可以聲明接收或返回指向不完整結構的指針的函數(shù):
void foo(struct lol *x);
但是,像您一樣,僅在函數(shù)聲明中使用未聲明的結構,將被解釋為局部不完整聲明,struct lol其范圍受函數(shù)約束。這種解釋是由C標準強制執(zhí)行的,但是它沒有用(無法構造struct lol傳遞給函數(shù)的方法),并且?guī)缀蹩隙ú皇浅绦騿T想要的,因此編譯器警告。
- 3 回答
- 0 關注
- 1667 瀏覽
添加回答
舉報