【问题标题】:How to declare a struct variable with a linked list in it?如何声明一个带有链表的结构变量?
【发布时间】:2017-12-12 19:50:02
【问题描述】:

在我的.h 文件中,我有:

#include <linux/list.h>
struct myNode
{
    struct list_head list;
    int myID;
    int myBadge;
};
extern struct myNode firstNode;

对于在.c 文件中定义 firstNode 变量,我已经尝试过:

#include "test.h"
INIT_LIST_HEAD(&firstNode.list);

但是当我编译时,我得到了错误:

expected declaration specifiers '...' before '&' token INIT_LIST_HEAD(&firstNode.list);

我不太熟悉错误的实际含义(抱歉,我对 C 不太熟悉),所以我不确定为什么/这意味着什么。

【问题讨论】:

  • 我们需要您提供更多代码来提供帮助。
  • 您是否包含了list.h 标头?
  • 问题似乎是在您尝试使用 INIT_LIST_HEAD 的范围内没有定义。
  • 不知道为什么你被否决了。但是,不要使用除内核代码之外的 Linux 内核头文件。它们并非用于支持用户空间程序。
  • 请不要破坏您的帖子。如果您认为您的问题没有用或不再有用,则应删除,而不是编辑掉所有实际使其成为问题的数据。通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(根据 CC BY-SA 3.0 许可)。根据 SE 政策,任何破坏行为都将被撤销。

标签: c struct linked-list linux-kernel


【解决方案1】:

如 cmets 中所述,在全局范围(即在任何函数体之外)可执行代码是禁止的;此处只能使用声明和定义。

要定义firstNode全局变量和初始化列表,使用LIST_HEAD_INIT宏:

#include "test.h"
struct myNode firstNode =
{
    .list = LIST_HEAD_INIT(list);
}

【讨论】:

  • 实际上,宏可以扮演不同的角色之一。 LIST_HEAD 是一个 definition 宏 - 使用它可以定义一个列表类型的变量。 LIST_HEAD_INIT 是一个 initialization 宏 - 它可以用作变量初始化语句的右手。可以将 INIT_LIST_HEAD 视为 functional 宏 - 它执行一些操作并且不返回值。所以只能作为可执行代码使用。
  • 没错。您引用的标题定义了一个 functional 宏:它执行一些操作,并且不返回值。构造do { ... } while(0) 是Linux 内核中常用来定义此类宏的。请注意,LIST_HEAD_INIT 宏定义使用{a, b} 构造,可以将其分配给具有适当类型字段的结构变量。
猜你喜欢
  • 2014-01-06
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多