C++枚举中的的“redefinition; different type modifiers”

最近看《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范围内才处理。)

       使用枚举能在一定程度上减轻这种尴尬( 注1),它不但能实现类似于之前定义三个常量的功能,还能够将这三个值组合起来成为独一无二的组。例如:
           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了。不知道的,赶紧去看看吧。

猜你喜欢

转载自blog.csdn.net/www1157763637qqcom/article/details/21992159