创建具有自动值增量的定义头文件

Creating define header file with auto value increment

本文关键字:定义 文件 创建      更新时间:2023-10-16

这是我想要实现的输出。

#define car 1 
#define bus 2 
#define taxi 3 

。等等。

是否有可能,如果我在任何地方添加一个,它将自动帮助我生成数字示例 4(意味着取最大数字 + 1),但是如果我从中间示例中删除一个 #define 总线 2,编号将全部保留。如何创建这样的定义头文件?

C++本身没有什么可以做你所要求的。

显而易见的选择是创建一个自己的小工具来处理这项工作,或者改用像C++枚举这样的东西,这样你就会得到这样的东西:

enum {car=1, bus, taxi};

在这种情况下,在末尾添加项目将微不足道:

enum {car = 1, bus, taxi, airplane};

。但是从中间删除一个项目需要一些额外的工作:

enum { car = 1, bus, airplane = 4};
也就是说,在要跳过

数字的任何地方,都需要指定要分配给要跳过的数字之后的下一项的值(在未另行指定的地方,每个符号都会被赋予一个比其前身大一的值)。

我会使用一个用python编写的小工具,我们也在我们的构建系统中使用它来做这些事情。它用作预处理器。这些是必须在预处理器之前完成的事情,因为它不能用C++完成。

专用工具

main.py

# 1. Add items wherever you wish to extend
# 2. a. Set None for removed items
# 2. b. Do not add None if you want it all incremental (should be default)
mylist = ('car', 'bus', None, 'taxi')
with open('myheader.h', 'w') as f:
    for index, item in enumerate(mylist, 1):
        if item:
            f.write('#define %s %sn' % (item, index))

如果你想让它更pythonic,你甚至可以让它对普通C++程序员来说不那么全面。那时你会使用 python 理解,但它输出的是相同的。

mylist = ('car', 'bus', None, 'taxi')
with open('myheader.h', 'w') as f:
    [f.write('#define %s %sn' % (item, index)) for index, item in enumerate(mylist, 1) if item]

运行它

python main.py

输出文件

#define car 1
#define bus 2
#define taxi 4

然后,您将在尝试编译源代码之前在构建系统中调用此 python 脚本。我们在一个大型项目中这样做,它工作得很好。你需要将python作为依赖项,但无论如何,它几乎无处不在。

C++枚举

当然,在这种情况下,最好使用C++枚举,如下所示:

class enum Items
{
    car = 1,
    bus,
    taxi
};
如果您

能够使用至少 C++11,请不要忘记使用新的类枚举。

与旧样式相比,它们具有各种优势。无论如何,枚举的好处是默认情况下,它会自动将值从零开始递增一个。这也是为什么您需要根据问题中的需要明确使其从其中一个开始的原因。

但是,由于您的问题似乎也带有Qt标签,因此我会告诉您,您还可以研究一个Q_ENUMS宏,以扩展您对Qt中枚举的看法。

此外,如果您删除中间的值,则需要使用"原始"值标记删除后的值,因为枚举将为您"重述"这些值。

但是,您需要重新审视删除枚举值是否有意义。如果它是一个库,它将作为源不兼容的更改,您真的不应该经常这样做。当您这样做时,可以一次又一次地手动重新排序,因为无论如何都应该认为这样的更改很少见,因此对于这种极端情况可能根本不值得自动化。