我刚刚在 C 中发现了一个让我非常困惑的怪癖。在 C 中,可以在声明结构之前使用指向结构的指针。这是一个非常有用的功能,因为当您只处理指向它的指针时,声明是无关紧要的。不过,我刚刚发现了一个极端案例,这(令人惊讶地)不正确,我无法真正解释原因。对我来说,这看起来像是语言设计中的一个错误。
拿这个代码:
#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 和 clang 的编译器行为),而不是我粘贴的具体示例。
编辑:
我不会接受“声明的顺序很重要”作为答案,除非您还解释了为什么 C 会警告第一次在函数参数列表中使用结构指针,但允许在任何其他上下文中使用它。为什么这可能是个问题?