一、枚举、宏和常量
一般来说,写宏比较多的,大多是老的C++程序员或者一些比较硬核的程序员。这个硬核指的是和硬件或嵌入式打交道的,其实更接近C的风格。而C++程序员更多的喜欢使用常量包括C++11以后推出的constexpr(提醒:C和C++中常量的有细节的不同)。
那么既然有了这二者,为什么还要搞一个枚举出来,这不是多此一举么。老鸟们可能都是会心一笑,但对于一些新手,可能真得会有这种疑问。甚至有些开发人员看到C++11后出现了强类型的类枚举后更有些疑惑,意义何在?
二、问题场景
那么枚举(类)在哪些场景下应用比较多呢?只有明白了应用场景才可能找到它与其它方式的优势。一般来说,有以下几种情况:
1、显示的定义名称并需要经常完善和修改
举一个极端的例子,定义了一个星期的枚举是周一到周日,但是一个小说改编的游戏中一周是从周二到周九。如果用宏和常量则就工作量大了。还有比如和游戏的硬件通信,有一百个值,结果在发布后发现必须在中间增加几个值,那枚举的优势简单不要不要的。
2、大量相同的类似的变量应用管理(非常容易混淆的情况下)
这种情况是定义了大量雷同的操作,比如一个接口,传入整形值不同的组合会有不同的结果。虽然可以通过宏或常量来进行显示的定义,但如果这些名称长得相近,那么在数量多后就极容易出问题。而此时使用枚举类则可以防止类似的问题。
3、函数或模板通过参数来安全进行匹配
比如在使用枚举时,没有写全枚举并且没有default的情况下,编译器会有提示;函数重载有short和int的情况,如果使用枚举则可以很好的避开相关的风险,让编译器正确的推导出想用的函数,模板也是类似。
4、其它一些技巧
比如可以通过库直接打印枚举名称而非数字,可以利用枚举最后项做为数组的长度,重新定义项的起始位置(比如起始可以从0轻松的改成1等开始,可以让两个枚举项相等)等等。
这里需要提醒的是,上述的应用场景可能单纯使用枚举仍然会有一些细节上的小麻烦,所以建议使用枚举类。下文如不再显示指出枚举即指代枚举类。
三、枚举的优势和劣势
这里首先要明确,写程序的目的是什么?如果单纯只是给机器看,给CPU运行。那么枚举确实意义不大。其实如果那样的话,高级语言也没有意义。直接大家都二进制“卡卡”写01啥的不更方便。写程序更多的目的是为了给开发者看,用来学习、应用以及维护。高级语言的目的就是如此,是为了让开发者降低应用难度而不是让机器降低应用难度,对CPU来说,编译器最终编译成功的都是一大堆的01,无所谓。
明白这个道理就明白了枚举的优势,枚举就是了让开发者更方便,更容易管理,更容易维护,更容易为其它开发者看明白。举一个简单的例子(上面的第一种应用场景),在一个实际应用中,定义了生产面包的四种流程材料:
#define add_flour 0
#define add_water 1