试图理解 c 中的宏定义
trying to understand a macro definition in c
这是我试图理解的代码的一部分,但我不明白这样的宏是如何工作的。第一行 #define FOREACH_OMPD_STATE(macro)
定义了一个 function_like 宏 ,它有一个名为 'macro' 的参数,但其余的是什么定义是什么意思?
#define FOREACH_OMPD_STATE(macro) \
\
/* first available state */ \
macro (ompt_state_undefined, 0x102) /* undefined thread state */ \
\
/* work states (0..15) */ \
macro (ompt_state_work_serial, 0x000) /* working outside parallel */ \
macro (ompt_state_work_parallel, 0x001) /* working within parallel */ \
macro (ompt_state_work_reduction, 0x002) /* performing a reduction */
参数的那些不同值是名为 macro 还是什么?
FOREACH_OMPD_STATE
是一个 X macro。它提供了一个列表,通过传递各种宏来使用列表项来处理列表项。例如,我们可以使用仅生成名称的宏来制作 enum
标识符的列表:
#define NameOnly(name, value) name,
enum { FOREACH_OMPD_STATE(NameOnly) };
该代码生成(为便于阅读而添加的行格式):
enum {
ompt_state_undefined,
ompt_state_work_serial,
ompt_state_work_parallel,
ompt_state_work_reduction,
};
完成后,我们可以使用不同的宏来创建数组初始值设定项,以使用 FOREACH_OMPD_STATE
宏提供的值填充由 enum
标识符索引的数组:
#define MakeInitializer(name, value) [name] = value,
int ArrayOfValues[] = { FOREACH_OMPD_STATE(MakeInitializer) };
生成(为便于阅读而添加的行格式):
int ArrayOfValues = {
[ompt_state_undefined] = 0x102,
[ompt_state_work_serial] = 0x000,
[ompt_state_work_parallel] = 0x001,
[ompt_state_work_reduction] = 0x002,
};
关键思想是我们只需要在源代码中列出一次名称和值,在定义 FOREACH_OMPD_STATE
宏时,以后就可以以不同的方式使用它们而无需重复它们。
这是我试图理解的代码的一部分,但我不明白这样的宏是如何工作的。第一行 #define FOREACH_OMPD_STATE(macro)
定义了一个 function_like 宏 ,它有一个名为 'macro' 的参数,但其余的是什么定义是什么意思?
#define FOREACH_OMPD_STATE(macro) \
\
/* first available state */ \
macro (ompt_state_undefined, 0x102) /* undefined thread state */ \
\
/* work states (0..15) */ \
macro (ompt_state_work_serial, 0x000) /* working outside parallel */ \
macro (ompt_state_work_parallel, 0x001) /* working within parallel */ \
macro (ompt_state_work_reduction, 0x002) /* performing a reduction */
参数的那些不同值是名为 macro 还是什么?
FOREACH_OMPD_STATE
是一个 X macro。它提供了一个列表,通过传递各种宏来使用列表项来处理列表项。例如,我们可以使用仅生成名称的宏来制作 enum
标识符的列表:
#define NameOnly(name, value) name,
enum { FOREACH_OMPD_STATE(NameOnly) };
该代码生成(为便于阅读而添加的行格式):
enum {
ompt_state_undefined,
ompt_state_work_serial,
ompt_state_work_parallel,
ompt_state_work_reduction,
};
完成后,我们可以使用不同的宏来创建数组初始值设定项,以使用 FOREACH_OMPD_STATE
宏提供的值填充由 enum
标识符索引的数组:
#define MakeInitializer(name, value) [name] = value,
int ArrayOfValues[] = { FOREACH_OMPD_STATE(MakeInitializer) };
生成(为便于阅读而添加的行格式):
int ArrayOfValues = {
[ompt_state_undefined] = 0x102,
[ompt_state_work_serial] = 0x000,
[ompt_state_work_parallel] = 0x001,
[ompt_state_work_reduction] = 0x002,
};
关键思想是我们只需要在源代码中列出一次名称和值,在定义 FOREACH_OMPD_STATE
宏时,以后就可以以不同的方式使用它们而无需重复它们。