我刚刚在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