我收到了这个错误:
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) {
给出错误。
有谁知道如何解决这个问题?
答案 0 :(得分:23)
您已在f2
和f1
的声明之间(或可能在声明之后)声明了您的结构。移动你的struct声明,使它在两个声明之前出现。
也就是说:
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是从上到下严格编译的。
答案 1 :(得分:6)
编译器已经为你提供了很好的解释。
您尚未提前声明struct user_data_s
。编译器第一次在上面的函数定义中看到struct user_data_s
。在每种情况下,struct user_data_s
的声明都具有块范围,即它对应于相应函数的本地。这意味着struct user_data_s
定义中f1
的第一个声明与struct user_data_s
定义中f2
的第二个声明完全无关。这些声明声明了两个完全不同的本地(对每个函数)类型struct user_data_s
。您无法像示例中那样从f2
致电f1
,因为他们的参数类型完全不相关。
通常,您应该事先在文件范围声明struct user_data_s
,而不是在函数定义中声明它。您是否忘记在任何情况下都包含带有struct user_data_s
声明的标题?
答案 2 :(得分:0)
使用 typedef
的另一个充分理由,Linus/Linux 选择避免使用。
在函数参数列表中声明一个结构体是否合法?如果不是,那为什么编译器会认为它是结构定义?