我刚刚在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会在函数参数列表中第一次警告不要使用struct指针,但允许在任何其他上下文中使用它。为什么那可能是个问题?
慕尼黑的夜晚无繁华
慕妹3146593
相关分类