警告:在参数列表中声明'struct user_data_s'

Lou*_*ise 17 c

我收到这个错误:

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

你已经宣布你的结构中(或可能以后)你的声明之间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);
}
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是从上到下严格编译的.

  • 还有另一个常见但很难找到的原因可能会发生这种情况。具有该结构定义或其依赖项之一的头文件中存在错误。赠品通常位于警告列表的底部,因此很难罚款。 (2认同)

AnT*_*AnT 6

编译器已经为您提供了很好的解释.

你没有struct user_data_s提前任何地方宣布.编译器struct user_data_s第一次看到上面的函数定义.在每种情况下声明struct user_data_s具有块范围,即它对应于相应的函数.这意味着,所述第一声明struct user_data_sf1定义是完全不相关的所述的第二个声明struct user_data_sf2定义.这些声明声明两个完全不同的本地(对每个函数)类型struct user_data_s.您不能在示例中调用f2,f1因为它们的参数类型完全不相关.

通常,您应该struct user_data_s事先在文件范围内声明,而不是在函数定义中声明它.您是否忘记了包含struct user_data_s任何机会声明的标题?