C++ 将#定义为模式的匹配列表
我有一个标题,上面有很多C++ 将#定义为模式的匹配列表,c++,c-preprocessor,C++,C Preprocessor,我有一个标题,上面有很多#defines,如下所示: #define XY_ABC_FOO 1 #define XY_ABC_BAR 3 #define XY_ABC_PIPPO 5 #define XY_ABC_PLUTO 7 #define XY_ABC_ETC 19 ... 等等 我想把所有这些放在一个向量中,我可以手工(几分钟内)完成 std::vector defs={1,3,5,7,19,…} 但是,下次在标题中添加定义时,必须有人记住在我的代码中也添加它们 是否有任何非常聪明的
#define
s,如下所示:
#define XY_ABC_FOO 1
#define XY_ABC_BAR 3
#define XY_ABC_PIPPO 5
#define XY_ABC_PLUTO 7
#define XY_ABC_ETC 19
...
等等
我想把所有这些放在一个向量中,我可以手工(几分钟内)完成
std::vector defs={1,3,5,7,19,…}
但是,下次在标题中添加定义时,必须有人记住在我的代码中也添加它们
是否有任何非常聪明的预处理器/元编程技巧可以在编译时捕获它们?
我并不特别关心快速编译,因为它是测试代码,所以很少会在一夜之间编译。您可以使用
awk
:
awk '/^#define XY_ABC_\w+ \d+$/ {
if(line) {
line = line ", " $2
} else {
line = "std::vector<int> defs = { " $2
}
END { print line " };" }' < header.hpp > defs.hpp
awk'/^#定义XY\u ABC\uw+\d+$/{
如果(行){
行=行“,”$2
}否则{
line=“std::vector defs={”$2
}
结束{print line“};“}”defs.hpp
然后在主程序中使用
#include defs.hpp
来获取声明。您似乎只想使用#define
来实现这一点,但我几乎完全相信这是不可能的
但如果您允许这些值为constexpr
s,那么您就可以执行以下操作(这可能是不使用外部工具的最佳选择)
#定义定义定义\
C(XY_ABC_FOO,1)\
C(XY_ABC_杆,3)\
C(XY_ABC_PIPPO,5)\
C(XY_ABC_冥王星,7)\
C(XY_ABC_等,19)
#定义C(名称,值)constexpr int name=value;
蔑视
#未定义C
/* ... */
#定义C(名称、值)值,
std::vector defs={defs};
#未定义C
<代码> >我很抱歉,我在写的时候,它被错误地发布了。现在它已经完成了。你是说你想把所有的<代码>定义为<代码>向量吗?是一个值的可接受的,还是必须是宏?头不是我的控制,他们选择了宏。因为C++没有任何内省能力,在纯C++中,你已经走运了。如果你控制了这些定义,你可以把名字和值提取成可重用的东西,但是即使这样,你也不能在重复这样的列表的过程中,<代码> >定义< /Cord>。他说他不能改变原始的头文件。这个回答对于将来做HA的访问者来说还是有用的。我可以控制这些定义。
awk '/^#define XY_ABC_\w+ \d+$/ {
if(line) {
line = line ", " $2
} else {
line = "std::vector<int> defs = { " $2
}
END { print line " };" }' < header.hpp > defs.hpp
#define DEFS \
C(XY_ABC_FOO, 1) \
C(XY_ABC_BAR, 3) \
C(XY_ABC_PIPPO, 5) \
C(XY_ABC_PLUTO, 7) \
C(XY_ABC_ETC, 19)
#define C(name, value) constexpr int name = value;
DEFS
#undef C
/* ... */
#define C(name, value) value,
std::vector<int> defs = {DEFS};
#undef C