最近看《C++Primer》(电子书,第四版的)。话说看到疑问的地方自己编代码尝试,可是今天还就真被代码搞懵了。笔者运行环境XP+vc6.0。那么看到哪了呢?在《3.8枚举类型》,应该是91页。内容为:
打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即:
const int input = 1;
const int output = 2;
const int append = 3;
然后,调用以下函数:
bool open_file(string file_name, int open_mode);
比如,
open_file("Phenix_and_the_Crane", append);
这种做法比较简单,但存在许多缺点,主要的一点就是无法限制传递给open_file函数的第2个参数的取值范围,只要传递int类型的值都是合法的。(当然,这样的情况下的应对措施就是在open_file函数内部判断第二个参数的取值,只有在1,2,3范围内才处理。)
enum open_modes {input = 1, output, append};
本来就自己读书的时候课本太低级《C++面向对象程序设计教程》根本就没有详细介绍,然后就是枚举自己用的就少,好吧有点自己给自己找借口的感觉:就是没学好。自己就按照书上的代码敲上去:
const int _i=0; const int _o=1; const int _a=3; enum Open_Mode{_i=0,_o,_a}; <span style="white-space:pre"> </span>
void main() { int om = _o; cout<<_i<<" "<<om<<endl; }
暂且原谅笔者是个懒鬼,偷了一些懒,结果一运行,就报错了redefinition; different type modifiers。重定义。我盯着这个错最少看了5分钟。后来才想到枚举变量里面的值是现用现定义的。什么意思 enum Open_Mode{_i=0,_o,_a},这里面的_i等等属性都是现用现定义的,枚举变量申明前,它里面的属性是不用先定义的,我们用const int _i=0;这里_i定义了一次,然后在enum Open_Mode{_i=0,_o,_a};_i,_o,_a又重新定义了,而且_i已经被const声明了,这时候编译检查发现前面已经定义了一个同名变量,这就是系统报重定义的错的原因。也就是说前面的3个const变量的定义都不要。就留最后enum的定义就OK了。顺便说一下,我们这里面只给_i赋值了,那么其他的呢?它们的值你想过吗?笔者透露一下,_o是在前面的值得基础上加1了。不知道的,赶紧去看看吧。