这是我想要实现的输出。
#define car 1
#define bus 2
#define taxi 3
......等等。
是否有可能如果我添加一个ANYWHERE它将自动帮助我生成数字示例4(意味着取最大数字+ 1),但如果我从中间示例#define总线2中删除一个,编号将一切都还在。如何创建这样的定义头文件?
答案 0 :(得分:2)
C ++本身没有任何东西能够满足您的要求。
显而易见的选择是创建一个自己的小工具来处理工作,或者使用像C ++枚举这样的东西,这样你就可以得到类似的东西:
enum {car=1, bus, taxi};
在这种情况下,将项目添加到最后将是微不足道的:
enum {car = 1, bus, taxi, airplane};
...但是从中间删除一件物品需要额外的工作:
enum { car = 1, bus, airplane = 4};
也就是说,在您想要跳过某个号码的任何地方,您需要在跳过的号码后指定您想要分配给下一个项目的值(除非您另外指定,否则每个符号给予比其前身更大的值。)
答案 1 :(得分:1)
我会使用python编写的一个小的util,我们也在我们的构建系统中使用这些东西。它用作预处理器。这些是必须在预处理器之前完成的事情,因为它不能用C ++完成。
# 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 %s\n' % (item, index))
如果你想让它更加pythonic,你甚至可以让它对于普通的C ++程序员来说不那么全面。那么你会使用python comprehension,但它会输出相同的内容。
mylist = ('car', 'bus', None, 'taxi')
with open('myheader.h', 'w') as f:
[f.write('#define %s %s\n' % (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 ++枚举,如下所示:
class enum Items
{
car = 1,
bus,
taxi
};
如果您至少可以使用C ++ 11,请不要忘记使用新的类枚举。
与旧款相比,它们具有各种优势。无论如何,关于枚举的好处是它会自动为你增加一个值,默认情况下从零开始。这也是为什么你需要根据你的问题明确地从一个开始。
但是,由于您的问题似乎也标有Qt
,我会告诉您,还有一个Q_ENUMS宏,您可以查看以扩展您对Qt中枚举的看法
此外,如果您删除中间的值,则需要使用"原始"标记删除后的值。值为枚举将"重新计算"你的价值观。
但是,您需要重新审视是否删除枚举值是否有意义。如果它是一个库,它将作为源不兼容的变化,你真的不应该经常这样做。当你这样做时,可以手动重新排序,因为无论如何这种变化应该被认为是罕见的,因此根本不值得自动化。