内核代码中的c语法及其工作原理

Ama*_*tam 0 c linux kernel linux-kernel

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

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

struct task_struct {
    volatile long state;
    //some more data members
};
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

我对两件事感到困惑:

a)我觉得它用于初始化,但是任何人都可以为这种类型的结构初始化提出一些好的读数.

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

[编辑]我也注意到以下事项:c)是否\在必要的每一行的末尾.

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 8

struct task_struct whatever = INIT_TASK(someTsk);
Run Code Online (Sandbox Code Playgroud)

这导致以下代码:

struct task_struct whatever = { .state = 0 };
Run Code Online (Sandbox Code Playgroud)

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

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

不,你不能#ifdef在宏内使用.