扩展将 X 宏作为参数

通过使 X 宏的名称成为主宏的参数,可以将 X-macro 方法推广一点。这有利于避免宏名称冲突并允许使用通用宏作为 X 宏。

与 X 宏一样,主宏表示其重要性特定于该宏的项列表。在此变体中,可以像这样定义这样的宏:

/* declare list of items */
#define ITEM_LIST(X) \
      X(item1) \
      X(item2) \
      X(item3) \
/* end of list */

然后可以生成代码来打印项目名称,如下所示:

/* define macro to apply */
#define PRINTSTRING(value) printf( #value "\n");

/* apply macro to the list of items */
ITEM_LIST(PRINTSTRING)

这扩展到这段代码:

printf( "item1" "\n"); printf( "item2" "\n"); printf( "item3" "\n");

与标准 X 宏相反,其中 X 名称是主宏的内置特性,使用这种样式后,可能不需要甚至不希望后来取消定义用作参数的宏(在本例中为 PRINTSTRING)。