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

来源:互联网 发布:手机淘宝口令 编辑:程序博客网 时间:2024/06/07 03:29

最近看《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了。不知道的,赶紧去看看吧。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 晚上不吃宵夜饿了怎么办 办健康证身份证丢了怎么办 宁波二院怎么办健康证 健康证和培训证怎么办 楼下烧煤炉呛人怎么办 衣服染了笔渍怎么办 济宁二院怎么办健康证 刚按揭车的想卖怎么办 房子已过户银行不放贷怎么办 办房贷信用逾期给拒了怎么办 二手房过户了房贷下不来怎么办 没有房证的房子买卖怎么办 老公失踪房产证要他签字怎么办 税务机关对长期欠税怎么办 离婚有贷款的房子怎么办 买房没过户房主反悔怎么办 房子过户卖方爱人去世怎么办 黄浦区学生社会实践护照掉了怎么办 北京医保卡坏了怎么办 去了越南的签证怎么办 护照签证到期还在国外怎么办 办护照预约满了怎么办 未满16岁怎么办护照 办理护照采集指纹录不上怎么办 办理护照时指纹没有怎么办 未满16岁的怎么办护照 身份证照得太丑怎么办 武汉江夏怎么办健康证 小孩偏胖肚子大怎么办 手机安全中心密码忘记了怎么办 进京证一年12次怎么办 青霉素和头孢都过敏怎么办 手汗孢疹肿胀怎么办能吃消炎药吗 手机上办进京证怎么办 杭州公共自行车还车点满了怎么办 法院判决书下来对方不给钱怎么办 抓进看守所的人怎么办 在拘留所里病重抢救怎么办 昆明公租房户型确认后怎么办 18年工作好难找怎么办 我没工作了怎么办2018