警告:在参数列表中声明’struct user_data_s’
我收到此错误:
transform.c:23: warning: 'struct user_data_s' declared inside parameter list transform.c:23: warning: its scope is only this definition or declaration, which is probably not what you want
我认为是因为我有一个包含结构的结构。
这就是我想要做的:
void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); }
f1中的printf工作,但行
void f2(struct user_data_s* data) {
给出错误。
有谁知道我怎么解决这个问题?
拥抱,露易丝
您已经在f2
和f1
声明之间(或可能在声明之后)声明了您的结构。 移动结构声明,使其在两个声明之前出现。
也就是说:
struct user_data_s { int L; }; void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); }
编译没有错误,但是
void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } struct user_data_s { int L; }; void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); }
不会编译,因为f2
无法知道struct user_data_s
是什么。
您可能习惯于使用更高级语言进行编程,这种语言允许您将声明/定义放在任何地方(例如C#或Python),但遗憾的是,C是从上到下严格编译的。
编译器已经为您提供了很好的解释。
您尚未提前在任何地方声明struct user_data_s
。 编译器第一次在上面的函数定义中看到struct user_data_s
。 在每种情况下, struct user_data_s
的声明都具有块作用域,即它对应于相应函数的本地。 这意味着f1
定义中struct user_data_s
的第一个声明与f2
定义中struct user_data_s
的第二个声明完全无关。 这些声明声明了两个完全不同的本地(对每个函数)类型struct user_data_s
。 您不能像示例中那样从f1
调用f2
,因为它们的参数类型完全不相关。
通常,您应该事先在文件范围声明struct user_data_s
,而不是在函数定义中声明它。 您是否忘记在任何情况下都包含带有struct user_data_s
声明的标头?