為什麼 C99 標準都推出很長時間了,真正能夠完全支持 C99 的編譯器卻比較少?
此話怎講?編譯器不是衣服一樣越多越好,靠譜的編譯器有一個就夠。
主流的 C 語言編譯器都支持 C99,例如 gcc。話說,你似乎很難找出一個比 gcc 市場佔有率更高的 c 語言編譯器。無論是 Windows, Linux, OSX, Unix ,主流的系統說到 C 編譯(並非 C++ 編譯),也就是屈指可數的幾個,而這屈指可數的幾個 C 編譯器都可以支持 C99。
至於 Visual C++ 不支持 C99 ,那因為它是個 C++ 編譯器,而 C++ 編譯器確實沒有支持 C99 的義務,這完全合理。C 跟 C++ 是完全不同的語言,如果一個人總把 C 跟 C++ 當做差不多的東西,那麼他無論寫 C 程序還是寫 C++ 程序都寫不好,我也絕對不敢跟這樣的人一起共事。
至於 gcc 沒有支持 C99 的全部功能,而僅僅支持了 99% 的功能,這個你可以詳細去看看 gcc 的文檔,絕大部分功能已經支持,剩下的那些功能通常都是難以實現並且用戶使用頻率很低的功能。
http://gcc.gnu.org/c99status.html以上文檔解釋了 C99 那些功能沒有支持,以及不被支持的原因,我想可以回答樓主的問題。目前絕大多數C編譯器支持C99.MSVC不支持C99,部分原因在於,與Unix/Linux不同,Windows下實際較少使用c開發,而是C++,MSVC更多的是作為C++編譯器。如果需要支持C99的C編譯器,可以使用第三方的,比如gcc,C語言本身很容易保證不同編譯器生成目標的二進位兼容性——也就是說,不同編譯器編譯的庫可以混用。下面是微軟關於MSVC為何不支持C99的回應:
Unfortunately 1) There are many, many more users of the Microsoft C++ compiler than there are of the C compiler; 2) Anytime we do customers discussion and/or solicit feedback the overwhelming response is that we should focus on C++ (especially at the moment C++-0x); 3) We just don"t have the resources to do everything we would like. So while we are slowly improving our C-99 support (and we are active in the C-1x discussions) I can"t promise we"ll add any of these features.
Jonathan Caves
Visual C++ Compiler Team
http://connect.microsoft.com/VisualStudio/feedback/details/526116/c99-support
C99?C11不是都已經有了嗎?
有時候,標準走在編譯器的前面
而有時候,編譯器又走在標準的後面這就像股指,編譯器始終圍繞著標準上下波動
一是很多編譯器不更新了,所以對最新的標準支持不是很好(如Turbo C之類)。
二是C99新標準,很多偏僻的不常使用的特性,實現起來複雜或者說沒必要。畢竟標準是一個大眾的東西,不同的編譯器呢,在不同的行業里,可能對標準的某些特性不需要,但是有些新的需求標準里又沒有提到,編譯器又會在C99標準的基礎上擴展一些新的特性。
比如GCC,不斷更新、對C99標準的支持度達到99%。除了支持C99標準外,還進行了自己的各種擴展,比如零長度數組、屬性聲明等。
總之,標準也不是一成不變的,當一些特性,被廣大人民群眾接受的時候,標準也會適宜地更改,吸收一些好的特性添加進標準,如C++標準中的true、FALSE,想不到吧...
至於微軟的編譯器,那是C++編譯器,C++標準是基於ANSI C為基點不斷發展的。C99和C++標準從ANSI C開始就有了分叉。早期C語言教學都使用VC開發環境,讓大家認為VC就是C編譯器的錯覺。其實VC是C++編譯器,只不過跟C標準有了重合,才被廣泛使用。C99新標準下,嵌入式開發,再用VC系列,然後叫囂其它開發環境不好(C-free、GCC等),就是誤人子弟了。
原因可能是有些特性實現起來比較難,或者沒有必要,以至於有些平台上不願意投入資源去開發。
似乎部分由於題主你所疑問的這個問題,C11 把 C99 中一些必須的特性改為了可選的特性 (看起來有點像妥協)。畢竟得不到普遍支持總不是什麼好事。
使用clang
最主要的原因是:1、現在很少用C開發全新的項目,老代碼都是用C89或更早,轉C99沒有很強的動力;2、目前一線coder和標準制定者對新標準的一些特性還存在很大的爭議,比如linux狂熱者甚至對//這種極為方便的注釋方式都極端抵制;3、C用的最多的地方是嵌入式環境,這種環境下新標準的許多特性意義不大,比如complex類型
推薦閱讀:
※想學 C 語言,有沒有經典的書?
※我怎樣成為@vczh一樣的大神?
※每一次想自學C/C++都會倒在使用VS,這次又是一樣,幾乎抓狂,是不是智商有問題?
※編程語言分成這麼多種有什麼意義,難道不都是語法糖嗎?
※C 語言王者歸來,原因何在?