【问题标题】:invalid type argument of '->''->' 的无效类型参数
【发布时间】:2015-07-07 15:49:21
【问题描述】:
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/module.h>

int start(void){

    printk("starting module\n");
    printk("pid\ttask_name\tstate\n");

    struct task_struct *task;
    struct list_head *list;

    list_for_each(list,&init_task->children){
        task=list_entry(list,struct task_struct,sibling);
        printk("%5d\t%s\t%li\n",task->pid,task->comm,task->state);
    }
    return 0;
}


void ending(void){
    printk("closing module\n");
}

module_init(start);
module_exit(ending);

编译时出现如下错误

error: invalid type argument of ‘->’ (have ‘struct task_struct’)
  list_for_each(list,&init_task->children){
                               ^
include/linux/list.h:408:14: note: in definition of macro ‘list_for_each’
  for (pos = (head)->next; pos != (head); pos = pos->next)

我认为错误消息试图说“&init_task”应该有“struct task_struct”但这还不够吗?据我所知,变量“init_task”是在“linux/sched.h”中外部声明的,这意味着错误不应该是由于无法定位或找到“init_task”造成的。

由于指针应该在'->'之前,使用'&init_task'似乎是正确的。

有人能指出我在这里缺少什么吗?

---更新:已解决---

重新考虑 '->' 和 '&' 的运算符优先级,正确使用是 '(&init_task)->children' 或 'init_task.children'。但是,即使进行了更改,也出现了错误:

include/linux/list.h:408:31: error: invalid operands to binary != (have ‘struct list_head *’ and ‘struct list_head’)
  for (pos = (head)->next; pos != (head); pos = pos->next)

这个错误信息指出我应该在“struct task_struct”中提供“children”的地址。因此,我将有问题的行更改为:

list_for_each(list,&(init_task.children)){

解决了问题,编译顺利。

【问题讨论】:

    标签: c kernel


    【解决方案1】:

    init_task 是一个结构,而不是指针。因此,您应该在取消引用(&amp;init_task)-&gt;children 之前将其转换为指针,或者使用句点符号init_task.children 访问children&amp;init_task-&gt;children 表示init_task 指向的结构的children 字段的地址,如果它是指针的话。

    【讨论】:

    • 请注意,括号对于(&amp;init_task)-&gt;children 是必需的,因为-&gt;. 绑定得非常紧密,而且比&amp; 更紧密(作为地址运算符)。
    • 谢谢!我忽略了运算符的优先级。正如您所提到的,在“&”之前考虑了“->”,所以我显然把事情搞混了。根据您的见解,我设法处理了后续错误并对其进行了编译。谢谢!
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多