繁体   English   中英

C/C++ 将多个宏扩展为一个可变参数宏

[英]C/C++ expand multiple macros into one variadic macro

背景

我正在研究一个现有的代码库,它使用宏模式来生成类似于以下的样板方法:

START_MAP()
  MAP_ENTRY(a)
  MAP_ENTRY(b)
  // .....
  MAP_ENTRY(z)
END_MAP()

我正在重新实现这些宏生成的代码,但我无法触及这种模式,因为这需要大量的重构。 我需要将此模式扩展为一个宏(我定义),我们将其称为NEW_IMPLEMENT ,它是一个可变参数宏,其名称如下: NEW_IMPLEMENT(a, b, ..., z)

问题

如何重新定义START_MAPMAP_ENTRYEND_MAP以使当前存在的模式扩展到NEW_IMPLEMENT(a, b, ..., z)

到目前为止我尝试过的

#define NEW_IMPLEMENT(...) ...
#define START_MAP NEW_IMPLEMENT(
#define MAP_ENTRY(x) x,
#define END_MAP )

但是,这会引发预处理器错误: error: unterminated argument list invoking macro "NEW_IMPLEMENT"

您可以将模式扩展为NEW_IMPLEMENT(stuff) text ,但生成的宏不会被扩展 - C 预处理器不会重新扫描多个宏扩展的结果。

您可以通过将所有内容包装在另一个宏调用中来“加入”它们,这将强制对所有结果进行另一次传递。 而且您还需要将括号作为令牌传递,而不是字面意思,这样您就不会收到未终止的呼叫。

#define CALL(...)   __VA_ARGS__

#define PAREN (
#define START_MAP()   NEW_IMPLEMENT PAREN
#define END_MAP()   )
#define MAP_ENTRY(a)  a,

#define NEW_IMPLEMENT(...)  "Hello: " #__VA_ARGS__

CALL(
START_MAP()
  MAP_ENTRY(a)
  MAP_ENTRY(b)
  // .....
  MAP_ENTRY(z)
END_MAP()
)

但总的来说,我不明白。 为了代码的可读性和可维护性,我更愿意使用简单sed 's/START_MAP()/NEW_IMPLEMENT(/; s/MAP_ENTRY(a)/a,/; s/END_MAP()/)/'代码。 我不认为“不接触古代代码”是使代码库更加复杂的充分理由。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM