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)
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
在宏内使用.
归档时间: |
|
查看次数: |
461 次 |
最近记录: |