Danny Kalev是Informit.com网站C++板块的主持人,一个我比较欣赏的、死忠于C++的、略带有神经质的、敏感的blogger。今天他在informit上发表了一篇文章,题目吓死人:“Visual C++ 8.0劫持C++标准”。我赶忙跑来一看,原来是关于一个编译警告的。大致是这样的:VC++ 8.0对于std::copy算法的某种用法给出了这样的警告“此函数已经被废弃”。这还了得,惹恼了一向心地纯洁的Danny,于是写出文章来声讨。据他在文章里说,这个事情目前正在C++标准委员会的maillist中爆吵。
我觉得,C++有幸拥有一批像Danny Kalev这样的纯洁主义者,才没有成为巨人手中的玩物。C++也有幸拥有一些像Microsoft这样的big player,才能不断搞些新花样出来,不至于窒息而死。微软为什么要对这个std::copy提警告,原因很简单:安全性。这个std::copy的行为跟C语言的strcpy, memcpy差不多,是不由分说的,不计后果的。只要你脑子短路一秒钟,这个算法就能让你的应用程序分崩离析。
我该支持VC++的做法吗?也支持也不支持。正如我准备在马上召开的C++技术大会上的演讲里说的那样,一切有助于提高C++生产率的改进都是值得赞赏的。如果VC Compiler只是温存的建议和善意的提示一下,那么我想这里是没有任何争议的。这个提示也许可以让你避免几个星期的痛苦的debugging,对于生产率的提升效果不言而喻。然而,微软的警告用语是蛮横的,越过了界限。“废弃?”,微软认为自己有权废弃一个ISO标准中的算法?仅仅因为自己开发了一个编译器?这就好像是说,一家生产皮尺的公司可以改变1米的度量一样可笑。Danny通篇抨击的也就是这一点。
不过问题在于,看看这个标题,“劫持”,Danny,你的用语是不是也越过了界限呢?不管怎么说,我不认为VC8与标准C++是对立的东西。不,我认为VC8不是邪恶势力企图将C++引入歧途的工具,而是引导C++迈向未来的重要一步。只不过,微软即使要裹挟C++,动作也应该温柔一点。毕竟这不是你自家的VB和C#,想怎么掰持就怎么掰持。