Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将#定义为模式的匹配列表_C++_C Preprocessor - Fatal编程技术网

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