Q为什么声明
extern int f(struct x *p);会在参数列表中给出关于“struct x 已声明”的晦涩警告消息?
A在 C 的正常块作用域规则的一个怪癖中,在原型中首次声明(甚至提及)的结构不能与同一源文件中声明的其他结构兼容。(问题在于结构和标签在原型结束时超出作用域;请参阅问题 1.29。)
要解决这个问题,您应该重新安排事物,以便结构的实际声明先于使用它的函数原型。 (通常,原型和结构声明都会放在同一个头文件中,这样它们就可以相互引用。)如果您必须在原型中提及一个以前未见的结构,请在原型之前加上看起来空洞的声明
struct x;这会在文件作用域中放置一个(不完整的)声明struct x,以便所有后续涉及struct x的声明至少可以确定它们引用的是同一个struct x.
参考:ISO Sec. 6.1.2.1, Sec. 6.1.2.6, Sec. 6.5.2.3