【发布时间】:2013-05-30 08:44:32
【问题描述】:
我刚刚发现了一个 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 lol;提前告诉它结构存在 -
你应该先告诉编译器存在struct lol这样的类型,然后你可以在新函数的声明中使用struct lo或指向该struct的指针
-
另外,编译器似乎向您解释了确切的问题:范围。阅读警告!
标签: c