gpt4 book ai didi

c - 为什么我会收到此错误 : dereferencing pointer to incomplete type

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:24 27 4
gpt4 key购买 nike

我正在做一个类(class)项目,它可能是有史以来最糟糕的指令,我们必须实现一个简单的调度程序。虽然 C 编程不是类(class)的先决条件,但它是调度程序的语言,我不是一定是 C 程序员..

无论如何,我试图通过打印出任务来调试它,以便我可以通过程序跟踪它,但我不断收到以下编译时错误:

schedule.c:61:48: error: dereferencing pointer to incomplete type

这是 task_struct 定义:

struct task_struct
{
struct thread_info *thread_info;
int prio, static_prio, normal_prio;
unsigned long sleep_avg;
unsigned long long last_ran;
unsigned long long timestamp;
unsigned long long sched_time;
unsigned int time_slice, first_time_slice;
struct list_head run_list;
struct sched_array *array;
enum sleep_type sleep_type;
int need_reschedule;
};

我试图在内部调试的函数:

void initschedule(struct runqueue *newrq, struct task_struct *seedTask)
{
printf("Inside initschedule()\n");

printf("%s - TEST \n", (seedTask)->thread_info->processName); //causes compiler error

/* initialize runqueue and current task */
rq = newrq;
current = NULL;

/* allocate memory for runqueue schedule arrays */
rq->active = (struct sched_array*)malloc(sizeof(struct sched_array));
rq->expired = (struct sched_array*)malloc(sizeof(struct sched_array));

/* initialize schedule arrays */
INIT_LIST_HEAD(&rq->active->list);
INIT_LIST_HEAD(&rq->active->list);

/* activate task in scheduler */
activate_task(seedTask);

最奇怪的是,当我在调用上述函数的方法中使用相同的 printf(...) 时,它起作用了,但只是在我的函数中不起作用,其中 seedTask 传入。

基本上,我想知道为什么会出现此错误?

最佳答案

Why am I getting this error: dereferencing pointer to incomplete type?

添加以下行而不是包含头文件:

struct task_struct;

Forward 声明 task_struct 类,这对编译器来说意味着它是一个不完整类型。对于 Incomplete 类型,不能创建它的变量或做任何需要编译器知道 task_struct 布局的事情,或者除了 task_struct 只是一种类型这一事实之外。即:编译器不知道它的成员是什么以及它的内存布局是什么。
但是由于指向所有对象的指针只需要相同的内存分配,因此当仅引用不完整类型作为指针时,您可以使用前向声明。

请注意,前向声明通常用于存在类循环依赖的情况。

前向声明对于如何进一步使用 Incomplete 类型有其自身的限制。
使用不完整类型,您可以:

  • 将成员声明为指向不完整类型的指针。
  • 声明接受/返回不完整类型的函数或方法。
  • 定义接受/返回指向不完整类型(但不使用其成员)的指针的函数或方法。

对于 Incomplete 类型,您不能:

  • 用它来声明一个成员。
  • 使用此类型定义函数或方法。

建议的解决方案:
这里的问题是因为在函数 initschedule 中,您尝试访问 struct task_struct 的成员,即:

(seedTask)->thread_info->processName

所以这里的编译器需要知道成员thread_info的定义。您需要在 schedule.c 中包含定义 struct thread_info 的 header 。

为什么它在 schedule.h 中运行没有错误?
因为该头文件仅引用 struct thread_info 作为指针而不引用其成员,而 schedule.c 引用。

关于c - 为什么我会收到此错误 : dereferencing pointer to incomplete type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8000739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com