创建具有自动值增量的定义头文件
Creating define header file with auto value increment
这是我想要实现的输出。
#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中枚举的看法。
此外,如果您删除中间的值,则需要使用"原始"值标记删除后的值,因为枚举将为您"重述"这些值。
但是,您需要重新审视删除枚举值是否有意义。如果它是一个库,它将作为源不兼容的更改,您真的不应该经常这样做。当您这样做时,可以一次又一次地手动重新排序,因为无论如何都应该认为这样的更改很少见,因此对于这种极端情况可能根本不值得自动化。
- 告诉CMake链接到自定义文件夹中的Boost
- 通过cMake使用具有自定义文件扩展名的共享库
- 威纳派读取自定义文件或文件夹的所有访问权限
- 使用命令列表解析自定义文件
- 单独的类声明和方法定义文件问题
- Qt解析自定义文件格式
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- FAT32和NTF中的自定义文件属性
- 如何在没有"fatal error: Wt/WApplication: No such file or directory"的情况下将wt安装到自定义文件夹中
- C++ while 循环在自定义文件结构中
- QT C 读取自定义文件结构
- gcc 是否有编译指示来定义文件类型/编译器
- C/C++ 中的跨平台自定义文件头
- 使用头文件和类定义文件时未解决的外部符号错误
- 将此c++代码分解为单独的类规范文件和函数定义文件
- 自定义文件类中fstream对象的生存期
- 如何使用BinaryReader类使用C#读取自定义文件(C++)
- 提供带有libjpeg的自定义文件IO
- C++模块定义文件头内联符号
- 错误:未定义文件中的第一个引用符号