第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

奇怪的編譯器警告C:警告:參數(shù)列表內聲明了'struct'

奇怪的編譯器警告C:警告:參數(shù)列表內聲明了'struct'

C
達令說 2019-12-02 13:53:25
我剛剛在C語言中發(fā)現(xiàn)了一個奇怪的問題,令人感到困惑。在C語言中,可以在結構體聲明之前使用它的指針。這是一個非常有用的功能,因為在處理指向它的指針時,聲明是無關緊要的。但是,我只是發(fā)現(xiàn)一個極端的情況(令人驚訝地),這是不正確的,而且我無法真正解釋原因。在我看來,這似乎是語言設計中的一個錯誤。采取以下代碼:#include <stdio.h>#include <stdlib.h>typedef void (*a)(struct lol* etc);void a2(struct lol* etc) {}int main(void) {        return 0;}給出:foo.c:6:26: warning: ‘struct lol’ declared inside parameter list [enabled by default]foo.c:6:26: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]foo.c:8:16: warning: ‘struct lol’ declared inside parameter list [enabled by default]為了解決這個問題,我們可以簡單地做到這一點:#include <stdio.h>#include <stdlib.h>struct lol* wut;typedef void (*a)(struct lol* etc);void a2(struct lol* etc) {}int main(void) {        return 0;}無法解釋的問題現(xiàn)在由于無法解釋的原因而消失了。為什么?請注意,這個問題是關于語言C的行為(或者可能是gcc和clang的編譯器行為),而不是我粘貼的特定示例。編輯:我不會接受“聲明的順序很重要”作為答案,除非您也解釋了為什么C會在函數(shù)參數(shù)列表中第一次警告不要使用struct指針,但允許在任何其他上下文中使用它。為什么那可能是個問題?
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經(jīng)驗 獲得超6個贊

這是因為,在第一個示例中,該結構先前未定義,因此編譯器嘗試將對該結構的第一個引用視為定義。

通常,C是聲明順序很重要的語言。您使用的所有內容均應事先以某種能力進行適當聲明,以便編譯器可以在其他上下文中引用它時對其進行推理。

這不是語言設計中的錯誤或錯誤。相反,我認為這是為了簡化第一個C編譯器的實現(xiàn)而做出的選擇。前向聲明使編譯器可以一次通過串行轉換源代碼(只要知道一些信息(例如大小和偏移量))。如果不是這種情況,則編譯器只要遇到無法識別的標識符,便能夠在程序中來回移動,從而要求其代碼發(fā)射循環(huán)更加復雜。


查看完整回答
反對 回復 2019-12-02
?
慕妹3146593

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想要的,因此編譯器警告。


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 1667 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號