【发布时间】:2021-06-29 22:00:27
【问题描述】:
我有以下代码:
文件 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
当我尝试编译时,它给了我以下警告
警告:在参数列表中声明的“struct task_struct”在此定义或声明之外将不可见 17 | void initStats (struct task_struct* tsk);
我已经看到发布了类似的问题,但我无法解决问题。我想知道问题是否是因为两个文件相互包含。任何帮助将不胜感激:)。
编辑:我在代码中更改了几处。现在,我不使用 task_struct 作为参数,而是使用 struct stats。但是现在 sched.h 文件找不到 struct stats 的声明。我不知道如何解决这个问题。由于编译器给我的错误不同,我发布了一个新问题:Problem with declaration of structs in header files: "error: field 'stat' has incimplete type"
【问题讨论】:
-
你的标题中没有包含保护吗?他们真的会无条件地总是循环地包含彼此吗?这是缺少的重要信息。
-
您的问题是由您的标题的循环包含引起的。如果您首先包含
sched.h,它将包含stats.h。假设你确实有包含守卫,在stats.h中,编译器将在没有看到sched.h之前的声明的情况下到达函数声明。 -
尝试解决循环依赖或添加弗拉德回答中提到的前向声明。
-
是的,包括在内。感谢您指出,我已经编辑了问题。
标签: c struct scope header-files declaration