警告:‘struct task_struct’"Declared inside parameter list will not be visible outside of this definition or declaration"

warning: ‘struct task_struct’ "Declared inside parameter list will not be visible outside of this definition or declaration"

我有如下一段代码:

文件sched.h

   #ifndef __SCHED_H__
   #define __SCHED_H__
   #include <stats.h>
   truct task_struct {
       ...
       struct stats stat;
   };
   #endif

文件stats.h

   #ifndef STATS_H
   #define STATS_H
   #include <sched.h>
   struct stats
   {
   ...
   };

   void initStats (struct task_struct* tsk);
   #endif

当我尝试编译时,它给了我以下警告

warning: ‘struct task_struct’ declared inside parameter list will not be visible outside of this definition or declaration 17 | void initStats (struct task_struct* tsk);

我也看到过类似的问题,但一直没能解决问题。我想知道问题是否是因为两个文件相互包含。任何帮助将不胜感激:)。

编辑:我更改了代码中的一些内容。现在,我没有使用 task_struct 作为参数,而是使用了 struct stats。但是现在 sched.h 文件找不到 struct stats 的声明。我不知道如何解决这个问题。由于编译器给我的错误不同,我发布了一个新问题:

似乎在文件作用域中之前声明的结构struct task_struct在声明函数的地方不可见。

如果是,那么在此函数声明中

void initStats (struct task_struct* tsk);

类型说明符 struct task_struct 具有函数原型范围并且在函数原型之外不可见。

即此类型说明符与类型说明符不同

struct task_struct {
   ...
   struct stats stat;

};

在函数原型外声明。

来自 C 标准(6.2.1 标识符的范围)

  1. ...The same identifier can denote different entities at different points in the program.

  1. ...If the declarator or type specifier that declares the identifier appears within the list of parameter declarations in a function prototype (not part of a function definition), the identifier has function prototype scope, which terminates at the end of the function declarator

这是一个重现编译器消息的演示程序。

#include <stdio.h>

//  struct A;

void f( struct A );

struct A
{
    int x;
};

int main(void) 
{
    return 0;
}

prog.c:5:16: error: ‘struct A’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
 void f( struct A );
                ^

如果取消注释前向声明

//  struct A;

然后错误信息就会消失。