【问题标题】:trying to understand a macro definition in c试图理解 c 中的宏定义
【发布时间】:2021-11-14 22:00:03
【问题描述】:

这是我试图理解的代码的一部分,但我无法理解这样的宏是如何工作的。第一行 #define FOREACH_OMPD_STATE(macro) 定义了一个 function_like 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 */    

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

【问题讨论】:

  • 参数macro 是一个宏的名称,它与4 个不同的参数列表一起应用,可能会产生有用的结果。您必须查看 FOREACH_OMPD_STATE 用于查看有关这些宏调用的作用的更多信息。

标签: c macros


【解决方案1】:

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宏时,然后可以在以后以多种方式使用它们而无需重复它们。

【讨论】:

  • 一种有用的技术,在任何使用标识符列表(可能带有关联值)的情况下,例如语言的标记列表等。如果需要,参数的数量可以超过 2,这样所有信息都只是一旦组装,集中。您可以将预处理器标记字符串化,这些标记可用于调试信息,否则这些信息仅在具有反射的语言中可用。中心点是,当列表发生变化时,根本不需要触及任何代码。无价之宝。
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 2010-10-17
  • 2010-11-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多