Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #define宏的结构_C++_C_C Preprocessor - Fatal编程技术网

C++ #define宏的结构

C++ #define宏的结构,c++,c,c-preprocessor,C++,C,C Preprocessor,我在include/linux/wait.h中发现了这个神秘的结构 #define DEFINE_WAIT_FUNC(name, function) \ wait_queue_t name = { \ .private = current,

我在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),     \
        }
一般来说,我对宏和预编译指令了解很多,但我对这一点完全不了解。请有人详细解释一下上面的代码结构,包括行尾的“\”。谢谢


注意:我不需要知道它在linux中做什么,只需要知道它背后的语法含义

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

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

宏(大概)正在将结构与函数指针关联起来,并执行公共初始化。假设您想将这些结构添加到列表中,然后(在执行步骤中)调用不同的函数。 更好的问题至少包括等待队列定义。

宏(大概)是将结构与函数指针关联起来,并执行公共初始化。假设您想将这些结构添加到列表中,然后(在执行步骤中)调用不同的函数。 一个更好的问题应该至少包括等待队列定义。

根据其他(),
\
字符通过c预处理器继续任何一行。其余的呢,

#定义定义等待函数(名称、函数)\

宏的定义

使用宏替换名称声明一个
wait\u queue\t

使用
当前任务指针初始化
private
wait\u queue\t结构成员。这也是一个宏(可能是内联汇编程序),由Linux树中的每个体系结构定义

func
成员设置为函数参数

将列表初始化为空<代码>任务列表
指向自身

表示法在整个内核源代码中都使用,它是一个gcc特性(后来是C99),名为。不必设置结构的所有成员,只初始化已命名的成员,而将其他成员设置为零。这允许人们在不修改所有声明的情况下扩展结构。它不是一个c预处理器功能,而是一种“c”语言(扩展)。

根据其他(),
\
字符通过c预处理器继续任何一行。其余的呢,

#定义定义等待函数(名称、函数)\

宏的定义

使用宏替换名称声明一个
wait\u queue\t

使用
当前任务指针初始化
private
wait\u queue\t结构成员。这也是一个宏(可能是内联汇编程序),由Linux树中的每个体系结构定义

func
成员设置为函数参数

将列表初始化为空<代码>任务列表
指向自身


表示法在整个内核源代码中都使用,它是一个gcc特性(后来是C99),名为。不必设置结构的所有成员,只初始化已命名的成员,而将其他成员设置为零。这允许人们在不修改所有声明的情况下扩展结构。这不是c预处理器功能,而是一种“c”语言(扩展)。

谢谢您的回答,非常感谢。其余的呢。理解#define?@anupsumithri主体中的wait_queue_t name={.private=current,…}部分对我来说非常重要,它与宏无关,而是C99语法@雷米亚贝尔非常感谢。非常感谢你的链接。谢谢你的回答,非常感谢。其余的呢。理解#define?@anupsumithri主体中的wait_queue_t name={.private=current,…}部分对我来说非常重要,它与宏无关,而是C99语法@雷米亚贝尔非常感谢。非常感谢你的链接。
   wait_queue_t name = {                                            \
            .private        = current,                              \
            .func           = function,                             \
            .task_list      = LIST_HEAD_INIT((name).task_list),     \