我收到这个错误:
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
Run Code Online (Sandbox Code Playgroud)
我认为是因为我有一个包含结构的结构.
这就是我想要做的:
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);
}
Run Code Online (Sandbox Code Playgroud)
f1中的printf工作,但是行
void f2(struct user_data_s* data) {
Run Code Online (Sandbox Code Playgroud)
给出了错误.
有谁知道我怎么解决这个问题?
Mar*_*off 26
你已经宣布你的结构中(或可能以后)你的声明之间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);
}
Run Code Online (Sandbox Code Playgroud)
编译没有错误,但是
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);
}
Run Code Online (Sandbox Code Playgroud)
不会编译,因为f2
无法知道是什么struct user_data_s
.
您可能习惯于使用更高级语言进行编程,这种语言允许您将声明/定义放在任何地方(例如C#或Python),但遗憾的是,C是从上到下严格编译的.
编译器已经为您提供了很好的解释.
你没有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
任何机会声明的标题?