我对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
}
答案 0 :(得分:8)
struct task_struct whatever = INIT_TASK(someTsk);
这导致以下代码:
struct task_struct whatever = { .state = 0 };
这是一种有效的C语法,可以通过名称而不是位置来初始化结构中的字段。这样做可以使代码对于未在最后位置添加的struct成员安全。
关于反斜杠:是的,它们是必需的,因此预处理器知道宏继续在下一行。
不,你不能在宏中使用#ifdef
。
答案 1 :(得分:0)