0

我对 linux 内核代码中使用的语法有疑问。我对它的作用有直觉,但我想更正式地了解它。我正在使用内核v3.5.4

在文件/include/linux/sched.h中定义了以下内容

struct task_struct {
    volatile long state;
    //some more data members
};

并且在文件/include/linux/init_task.h文件中定义了以下内容:

#define INIT_TASK(tsk) {
    .state     = 0,               \
    //some more initializations

}

我对两件事感到困惑:

a)我觉得它用于初始化,但任何人都可以建议一些关于这种类型的结构初始化的好读物。

b)我不明白以下初始化是如何工作的。就像 this#define和相应的task_struct结构是如何相关的。

[编辑] 我还注意到以下几点:c)\在每行必要的末尾。

d) 内核的许多部分都包含在#ifdef #endif. 如果要初始化包装的数据成员,#ifdef #endif我们可以使用这种形式的初始化。我的意思是我们可以像这样使用#ifdef #endifinsideINIT_TASK()

#define INIT_TASK(tsk) {
    .state     = 0,               \

    //some more initializations
    #ifdef CX 
    .tickets   = 5,               \
    #endif

}
4

1 回答 1

8
struct task_struct whatever = INIT_TASK(someTsk);

这导致以下代码:

struct task_struct whatever = { .state = 0 };

这是通过名称而不是位置初始化结构中字段的有效 C 语法。这样做可以使代码对未添加到最后位置的结构成员安全。

关于反斜杠:是的,它们是必要的,因此预处理器知道宏在下一行继续。

不,您不能#ifdef在宏中使用。

于 2012-10-07T12:45:28.473 回答