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

时间:2012-10-07 12:42:49

标签: c linux linux-kernel kernel

我对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)我不明白以下初始化是如何工作的。就像这个#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

}

2 个答案:

答案 0 :(得分:8)

struct task_struct whatever = INIT_TASK(someTsk);

这导致以下代码:

struct task_struct whatever = { .state = 0 };

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

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

不,你不能在宏中使用#ifdef

答案 1 :(得分:0)