[英]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_MAP
、 MAP_ENTRY
和END_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.