恐怖的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.www58058.com/2446

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

相關推薦

  • 每日一練–8.10 腳本

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空…

    Linux干貨 2016-08-15
  • Linux基礎概念

    一、計算機的組成及其功能。 計算機機系統由五部分組成:運算器、控制器、存儲器、輸入設備、輸出設備,遵從馮.諾依曼體系結構。具體的功能如下 : CPU   :     運算器(處理數據)、控制器(指令控制),另有寄存器、緩存(緩沖數據,內部緩存非  常昂貴); 存儲器:內存即RAM(隨機訪問…

    Linux干貨 2016-10-09
  • shell練習

    1 、編寫腳本/root/bin/systeminfo.sh, 顯示當前主機系統信息, 包括主機名,IPv4 地址,操作系統版本,內核版本,CPU 型 號,內存大小,硬盤大小。 運行后結果是: 2 、編寫腳本/root/bin/backup.sh ,可實現每日將/etc/ 目錄備 份到/root/etcYYYY-mm-dd中 運行結果是: 3 、編寫腳本/r…

    Linux干貨 2016-08-15
  • N26—第三周

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who | cut -d ' ' -f 1 |sort -u l_cong root (unknown)   2、取出最后登錄到當前系統的用戶的相關信息。 [l_cong@localhost ~]$…

    Linux干貨 2017-02-15
  • 文件系統配額操作

    創建磁盤配額是實際工作中會遇到的內容,下面是一個磁盤配額的全部過程 一、總體步驟 1 啟用配額掛載選項 2 創建配額數據庫 3啟用數據庫 4指定用戶空間限制 5測試 6查詢 二、分步操作過程 (1)  查看獨立的磁盤(或者是分區) [root@localhoast ~]# lsblk NAME   …

    Linux干貨 2016-11-23
  • ?Web服務器之apache

    Web服務器之apache http協議 telnet的使用 curl命令 httpd的相關配置 welcome.conf — 403 forbidden 修改監聽的端口和地址 保持連接 DSO 定義物理主機站點文檔 資源訪問授權 路徑別名Alias 本地httpd-manual 開啟status 日志設定 虛擬主機 基于用戶的訪問控制 httpd壓力測試 …

    Linux干貨 2016-10-08
欧美性久久久久