恐怖的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”,你会觉得那只是一个幻觉吗?

转自:http://coolshell.cn/articles/1724.html

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/2446

(0)
s19930811s19930811
上一篇 2015-04-03 22:07
下一篇 2015-04-03 22:07

相关推荐

  • Linux三剑客之sed

    sed:全称stream EDit 行文本编辑器 作用:是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在模式空间,接着用 sed命令处理缓冲区中的内容,处理完成后,把模式空间的内容输出到标准输出。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 Sed主要用来自动编辑一个或多个文件,简化对文件的反复操…

    Linux干货 2016-08-12
  • linux常用基础命令简介

    linux常用基础命令简介 linux入门 基础 笔记 linux新手入门常用命令语法参数简介 linux常用基础命令简介 cd 语法 选项 ls 语法 选项 echo 语法 选项 history 语法 选项 man 语法 选项 cd cd命令用来切换工作目录至指定目录。 其中指定目录表示法可为绝对路径或相对路径。若目录名称省略,则变换至…

    Linux干货 2017-03-26
  • 用户、组及权限管理详解

    用户类别:Liunx中用户标识范围在0-65535之间; 超级用户(管理员) —— 默认为root,拥有所有权限。UID与GID值为0, 普通用户 系统用户 —— CentOS6中UID与GID值为1~499,CentOS7中UID与GID值为1~999。默认不能登录系统,存在主要是满足系统进程对文件属主的需求; 登录用户 —— CentOS6中UID与GI…

    2018-03-08
  • 一切皆文件——Linux基本命令(1)

    1.一切皆文件 在dev下有很多硬件的文件 sr0是光驱 console是终端,也划为一个文件   2.查看终端   3.两个终端发信 首先右键选择Clone Session,新客隆了一个centos6 分别使用tty命令查看终端名。 分别为0和1 通过命令:echo “想发送的信息“ > 终端名 即可发送 在0中输入命令: 在1中…

    Linux干货 2017-07-13
  • 变量的高级操作

                                                  一  字符串切片 &nbsp…

    Linux干货 2017-04-16
  • 第一周学习总结

    俗话说,好记性不如烂笔头,在当今移动互联网横行的时代,烂笔头就是网络,而笔记本就是各种平台。 作为一个IT人,有人突然问你计算机是啥,你可能不会像学文科的人一样给他说,就是电脑啊。这时候就是凸显IT知识技能的时候了,那么我下面就给您慢慢的道来。 在1946年美籍匈牙利人冯·诺依曼首次提出了自己的计算机体系理论,简称冯·诺依曼体系,主要是说计算机由五大基本部件…

    2017-12-14