恐怖的C++语言
Linus曾经(2007年9月)在新闻组gmane.comp.version-control.git里和一个微软的工程师(Dmitry Kakurin)争执过用C还是用C++,当时的那个微软的工程师主要是在做Git的Windows版,但他却发现Git的源码居然是C语言写的,而不是C++,于是他(Dmitry Kakurin)在Linux社区里发贴表示对Linux的不满,语言很直接:
Pure C as opposed to C++. No idea why. Please don’t talk about portability, it’s BS. (纯C写的,而不是C++,不知道为什么,请别告诉我是为了移植性,这完全是胡扯。)
Linux之父Linus Torvalds马上跟贴,在贴子中,Linus言辞很直接,直接表明C++是一个很恐怖的语言,他在贴子中说:
*YOU* are full of bullshit. C++ is a horrible language. It’s made more horrible by the fact that a lot of substandard programmers use it. (你才是完全在胡扯。C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它)
Linus的这个观点我是比较同意的,我个人也在几年前的《STL String类的写时才拷贝》以及以后的一些文章中表达过C++的确并不是一个很成熟的语言,这种观点一直都围绕着我。这是因为它的学习成本实在是太高了,编译器和类背着你做了很多你不知道的事,而且,C++非常容易地出错和发生很多意想不到的问题。
当然,这篇文章并不是要继续声讨C++,也不是回顾以前的某个事件。我们这里只谈技术。昨天,我在网上看到一个邪恶的C++的示例,在这里给大家share一下,让大家看看C++这种编程语言的恐怖和邪恶的一面。下面的这个例子,比那个“#define private public”还更加邪恶。
请看下面这段代码,你能告诉我它会输出什么吗?(注意main函数中高亮的那一行)
#include <iostream> #include <vector> typedef int UINT4; using namespace std; class Hack { }; Hack& operator< (Hack &a , Hack &b) { std::cerr << "小于操作符\n"; return a; } Hack& operator> (Hack &a, Hack &b) { std::cerr << "大于操作符\n"; return a; } int main(int argc, char ** argv) { Hack vector; Hack UINT4; Hack foo; vector<UINT4> foo; return(0); }
是的,上面这段代码如果只看main函数中的那句“vector<UINT4> foo”,你会觉得很眼熟,然而,事情并非那么简单,我们可以看到vector, UINT4和foo都是Hack类的实例,这就是邪恶的开始,那两个尖括号< >则成了两个运算符,大于和小于,这两个运算符却又被重载了。其实,真正的语句是:
vector.operator<(UNIT4).operator>(foo);
所以,所有的一切都符合我们的C++的规范和语法,自然程序也能被顺利编译通过(至少,在我的G++上是没有问题的)。而整个程序的运行结果自然是:
$ ./horror 小于操作符 大于操作符
是的,如果你通晓C++的一切的一切,你自然不会对这段程序感到惊奇。这样的事情在C/C++的世界中并不少见,要搞乱C/C++的代码并不是一件难事,花样多得数不胜数,只要看看《6个变态的C语言Hello World程序》你就知道了,而且,还有一个简单的教程《如何加密/混乱C源代码》告诉你一些简单的做法。
那么,如果你有一天在读程序中看到“vector<UINT4> foo”,你会觉得那只是一个幻觉吗?
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《恐怖的C++语言》的相关评论
@wuxqing
java的“严谨”,或者说是框条,是虚拟机支撑起来的,这也就是虚拟机语言永远不可能成为系统语言的原因,被背着跑,跑得再好也不是自己的.
自从知道Python以后就抛弃C++了。。
专注于 C + Python
这个例子能说明什么?
变态的东西, c语言就写不出来么? 断章取义.
再说, 这世界上用c++写的优秀的东西也可以说是不计其数吧?
c++不成熟? 难道只有c和汇编或者什么java才是成熟的语言?
再说, 哪个语言不会隐藏些东西在背后?
如果真的那么严重的不行, 除非全世界人都傻吧, 否则会有用c++来做产品吗?
我只同意liuns后半句”很多不合格的程序员在使用着它”.
这些人即便是用c, 也不会好到哪里去, 甚至会更差, 估计会更乱七八糟…
我始终认为C++是一门非常优秀的语言,在工程上比C强的多了.在编译的内部当然会有一些东西隐藏,关键是你知不知道如何去用它.容易出现错误只能说明你的管理能力差,你对它并不了解.要是比效率大家最好去用汇编,那多快呀.可你能编出100万行的汇编应用程序吗?
完全认同 用c++也好几年了 越来越觉得陷进多 如果没有10年c++深入研究 还是用c稳当点
@iloveit
+1
我觉得这个例子完全是在吹毛求疵,我觉得编程完全可以用一种大众更容易接受的形式来进行,而不是越走越远。
笔误
vector.operator(foo);
->
vector.operator(foo);
有个UNIT4 应该是 UINT4
高手往往都是这样,普通人往往就是:“语言不重要,思维最重要”的废话
我第一次看这篇文章是在3个月前,当时我刚刚基本看完C++ primer,当时我也觉得这真的很邪恶。
现在,我又返回来看这篇文章。
真的,我一点都不觉得邪恶。
文章的感觉就像上大学地时候,二级C语言考的题目,全是各种冷僻小知识,并且是因编译器不同而不同的。
C++的代码太长了,一大堆冒号!!!
没有什么比运算符重载更容易被滥用的了
所以说比较运算符就应该按部就班的返回布尔型
总之一句话,C++就是一种尽量给人可能性的语言
楼主适合用机器码来写程序,虽然还是有一些小小的风险
举这样极端的例子,真的不说明任何问题,除了让人觉得有点意思。
个人觉得楼主这才是扯淡!虽然我不是什么软件工程师,但任何编程语言都可以被搞乱好不!这就好像你拿把菜刀把自己小弟弟割了,然后拿出来告诉大伙菜刀不是个好东西!好刀用在刀刃上,建议楼主以后不要割自己小弟弟了!!!
无意间看到这篇,对比近2年博主的文章,博主对c++理解深度的增加和看法的转变,非常明显啊
虽然我现在是C++的初学者, 甚至连C++的门都没有摸着, 而且我也知道博主是大牛, 但我也不敢苟同本文的例子….
程序员非要那样写, 再好的语言也会 出问题…
这些代码跟C++语言有必然的联系?若用C写出那些所谓变态、恐怖的代码,还不需要那么多繁琐的步骤吧!
对论据不怎么认同呢
C++,上天遁地,欲穷天地之游耶?
其父曰:实非世间之人所能尽释。
把 using namespace std; 去掉要好点。
这个例子真的不对,c++的确是比较啰嗦杂乱的语言,但这个例子的作者显然是没明白c++引入这些功能的意义,操作符重载的目的是为了让自定义类型能更直观精炼的使用原始操作符,如:
cout << "i'm ok" << endl;
但这个功能并不能阻止你干愚蠢的事儿,例如这个例子。这些愚蠢的使用方式,可以从compiler,lint层面来修正,当然,如果能从语言层面修正,也不错,但c++既然定位为系统语言,是不会阻止人干任何可能性的。