#define宏的结构

时间:2014-01-31 04:08:10

标签: c++ c c-preprocessor

我在include / linux / wait.h

中找到了这个神秘的构造
 #define DEFINE_WAIT_FUNC(name, function)                                \
        wait_queue_t name = {                                            \
                 .private        = current,                              \
                 .func           = function,                             \
                 .task_list      = LIST_HEAD_INIT((name).task_list),     \
        }

我对macros和preproc指令一般都知道很多,但我绝对迷失在这一点上。有人可以详细解释上面的代码 结构 ,包括行尾的'\'。感谢。

注意:我不需要知道它在linux中的作用,只需要知道它背后的语法含义。

3 个答案:

答案 0 :(得分:2)

宏中的\字符是行继续符。它只是允许宏跨越多行。

答案 1 :(得分:1)

宏(可能)是使用函数指针进行结构定位并进行常规初始化。不要说你想将这些结构添加到列表中,然后(在执行步骤中)调用不同的函数。 一个更好的问题至少包括wait_queue_t定义。

答案 2 :(得分:1)

与其他人(and many references on-line)一样,\字符通过c-preprocessor继续任何行。至于其余的,

  

#define DEFINE_WAIT_FUNC(名称,功能)\

宏的定义。

   wait_queue_t name = {                                            \

使用宏替换 name 声明wait_queue_t

            .private        = current,                              \

使用private任务指针初始化current wait_queue_t结构成员。这也是Linux树中每个体系结构定义的宏(可能是内联汇编程序)。

            .func           = function,                             \

func成员设置为 function 参数。

            .task_list      = LIST_HEAD_INIT((name).task_list),     \

将列表初始化为空。 task_list指向自己。

.表示法用于整个内核源代码,并且是 gcc 功能(以及后来的C99),称为designated intializers。而不必设置结构的所有成员,只初始化命名的成员,其他成员设置为零。这允许人们在不修改所有声明的情况下扩展结构。它不是 c-preprocessor 功能,而是一个' C'语言(扩展名)。