我曾经坚信const是可靠的......
但是看过<<COM本质论>>后,我开始怀疑C++真的不是二进制级约束,而只是语言层面的约束;C++只是喜欢"守规矩"的用户......
我前几天碰到这件事:同事找我说发现了问题但不知道为什么,什么问题呢?他是这样写的:
1.某H文件:
extern unsigned int ID;
unsigned int GetNewID(unsigned int&);
const unsigned int MSG_1 = GetNewID(ID);
2.某CPP文件:
unsigned int ID = 0;
unsigned int GetNewID(unsigned int& uiID){
return ++uiID;}
3.在两个CPP里包含这个.H文件,因为要用到这个MSG_1.
然后编译通过,他完全相信了const的行为,但是运行的结果却是MSG_1的赋值执行了两次!!
我帮他写的测试表明:有多少个CPP包含这个H文件,这个赋值就执行多少次!
我抛开他的写法不说(他这种用法是错误的),单说C++的const,这一点也论证了C++不是二进制约束!
回到问题,我得到的经验是:不要偷懒,使用C++要"遵守规矩"......
本文引用通告地址: http://blog.csdn.net/BigFanOfCpp/services/trackbacks/419435.aspx [点击此处收藏本文]
发表于 2005年07月10日 10:30 PM
-->
panic 发表于2005-07-11 9:49 AM
楼主, 首先: const unsigned int MSG_1 = GetNewID(ID); 这个行为叫做初始化而不是赋值。 C++在语法上是禁止对const变量修改的,但是初始化不可能被禁止。 其次: 把变量的定义写在头文件中,这个头文件被多个CPP文件引用的时候,会出现重定义的错误。 而const变量因为编译器常量折叠的处理,有可能不出现重定义,但是这么做毫无疑问也是错误的。 再次: const的约束的确是语言层面的,事实上C++几乎不提供任何二进制层面的约束,这才是一种语言,这种特性确保了C++可以在不同的二进制实现中有效运作。 最后: 不要吧自己的错误,以及自己对语言语法和语义的理解错误归结到语言自身上来。
|