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

时间:2009-11-12 03:15:46

标签: 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

我认为是因为我有一个包含结构的结构。

这就是我想要做的事情:

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) {

给出错误。

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:23)

您已在f2f1的声明之间(或可能在声明之后)声明了您的结构。移动你的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 选择避免使用。

在函数参数列表中声明一个结构体是否合法?如果不是,那为什么编译器会认为它是结构定义?