使用自动值增量创建定义头文件

时间:2014-12-24 02:32:36

标签: c++ qt

这是我想要实现的输出。

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

......等等。

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

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 ++完成。

专用工具

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 %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 ++ enum

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

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

如果您至少可以使用C ++ 11,请不要忘记使用新的类枚举。

与旧款相比,它们具有各种优势。无论如何,关于枚举的好处是它会自动为你增加一个值,默认情况下从零开始。这也是为什么你需要根据你的问题明确地从一个开始。

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

此外,如果您删除中间的值,则需要使用"原始"标记删除后的值。值为枚举将"重新计算"你的价值观。

但是,您需要重新审视是否删除枚举值是否有意义。如果它是一个库,它将作为源不兼容的变化,你真的不应该经常这样做。当你这样做时,可以手动重新排序,因为无论如何这种变化应该被认为是罕见的,因此根本不值得自动化。