警告:在参数列表中声明’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) { 

给出错误。

有谁知道我怎么解决这个问题?

拥抱,露易丝

您已经在f2f1声明之间(或可能在声明之后)声明了您的结构。 移动结构声明,使其在两个声明之前出现。

也就是说:

 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声明的标头?