c - 试图理解c中的宏定义

标签 c macros

这是我试图理解的代码的一部分,但我无法理解这样的宏是如何工作的。第一行#define FOREACH_OMPD_STATE(macro)定义了一个类似函数的宏,它有一个名为“ma​​cro”的参数,但是定义的其余部分做什么意思是?

#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 */    

这些不同的值是名为的参数还是什么?

最佳答案

FOREACH_OMPD_STATEX 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 宏时列出一次名称和值,然后就可以在以后以多种方式使用它们,而无需重复它们。

关于c - 试图理解c中的宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69967512/

相关文章:

c - 错误使用字符串化

c - 在 C 中,这个宏定义了什么?

c - RTP 数据包的套接字问题

命令行界面和过程控制

c - stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是什么?

c - 如何检测字符串中的空格?

visual-studio-2010 - 宏不在 Visual Studio 2010 中运行

c - 关闭特定函数的 DEBUG 宏 (NDEBUG)

c - 计算参数数量的宏

c - FFT bin 宽度说明