c++ - #define 的匹配列表到一个模式

标签 c++ c-preprocessor

我有一个包含很多 #define 的 header ,如下所示:

#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
...

等等等等。

我想将所有这些都放在一个 vector 中。我可以手动完成(几分钟内)。

std::vector<int> defs = { 1, 3, 5, 7, 19 , ... } 

但是,下次在 header 中添加定义时,必须有人记得将它们也添加到我的代码中。

是否有任何非常聪明的预处理器/元编程技巧可以在编译时捕获它们? 我并不特别关心快速编译,它是测试代码,因此很少编译,而且大部分时间都在一夜之间编译。

最佳答案

你可以用 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

然后在您的主程序中使用#include defs.hpp 获取声明。

关于c++ - #define 的匹配列表到一个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37731375/

相关文章:

c++ - 'int APIENTRY _tWinMain' 中的第二个 return_type 是什么意思

c++ - 在文件中维护链表

C++ #define 我的我 ->

c++ - 在没有预处理器的情况下扩展 C/C++ 函数宏

c++ - 使用 Boost assign 初始化具有变量值的类 JSON 映射

c++ - Qt MySQL 查询 - 无法绑定(bind)值

c++ - std::random_shuffle 线程安全吗?

c++ - 在预处理器指令中包含静态库

c - 用 C 预处理器模拟继承

c++ - 多行预处理器宏