[讨论] 【靠谱例程联盟】20131222 不够安全的enum

辛昕   2013-12-22 16:10 楼主
在C/C++里,我们都知道,可以用enum枚举型定义那些取值有限固定的 变量。
很可惜,这个类型是不带安全检查的。

意思就是说,假如你enum了一个周变量,它只有Mon = 1,Tue = 2,Wed =3.....
假如你传入一个 8 或者 某处计算出错突然冒出了个9

原则上来说我们非常希望它会做点什么
但实际上他什么都不会做。

它和一般的宏相比,我想,唯一的好处就是 看的时候比较舒服吧。
是的,可读性很重要,可是现在我觉得,它对机器运行的效果也非常重要。

不过仔细想了想,要强求他做到这些事情,也的确有点强人所难。
所以,只好我们自己干了。

查资料时,看到java没有采纳这个类型,不过它提供了另一种增加安全检查更加安全的枚举型。
因此,这个记录就是,我们希望试图为C/C++构建这样一个带安全检查的 安全枚举型。

回复评论 (1)

这个小问题这么久我一直没有彻底想明白。

现在确认了。

因为枚举其实是常量,它不是变量。

就是说,它其实和宏没有太大区别,我试图看 《ANSI C标准》这本书——一份文档的中文翻译。

 

这份文档我搜索了 枚举 这两个字,基本上都带上了 常量 的描述。

 

当然,我匆匆搜索着看,其实并没有确切,那么,枚举这个常量和 const 以及宏 的区别到底是什么?

但是很显然,它是常量,最大的一个说法就是

 

你enum 了 MONDAY是1以后,你不可能给MONDAY赋值成其他数值,由此可见,它和我们平时熟悉的C变量完全是两回事。

——当然,以后我再enum的时候,也就会全部用大写了,也就是宏那个形式。

 

但这样一来,也就是说,用enum来做用户定义的数据类型,真的意义不大,至少它不能提供 C编译器层面的检查。

 

如果想实现这个目的,得另外想办法。或者利用一定的人为检查手段。

 

 

 

 

 

 

 

强者为尊,弱者,死无葬身之地
点赞  2021-2-26 23:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复