我剛剛在C中發現一個怪癖,我覺得很混亂。在C語言中,可以在聲明之前使用指向結構體的指針。這是一個非常有用的特性,因爲當你只是處理一個指針時,聲明是無關緊要的。然而,我發現了一個角落的情況,但這並不是真的,我真的不能解釋爲什麼。對我來說,在語言設計中看起來像是一個錯誤。奇怪的編譯器警告C:警告:在參數列表中聲明'struct'
把這個代碼:
#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;
}
無法解釋的問題現在已經走了一個無法解釋原因。爲什麼?
請注意,這個問題是關於語言C的行爲(或可能編譯器行爲的gcc和叮噹),而不是我粘貼的具體示例。
編輯:
我不會接受「聲明的順序是非常重要的」作爲回答,除非你也解釋了爲什麼C將警告在函數參數列表使用結構指針的第一次,但允許它在任何其他情況下。爲什麼這可能是一個問題?
你應該仍然告訴它的結構預先存在使用'struct lol;' – Dave
你應該首先告訴編譯器存在這樣的類型結構lol,然後你可以使用struct lo或一個指向結構的指針在新函數的聲明中 – hetepeperfan
另外它看起來像編譯器向您解釋了確切的問題:範圍。閱讀警告! – Dave