搜索
熱搜: 活動 交友 discuz
查看: 1197|回復: 0
打印 上一主題 下一主題

[教學] C++標準與實作之間

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-14 04:38:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一篇很舊的資料,我覺得他很有趣,也有某些參考價值

對一個開發環境而言,最重要的是增加生產效率和降低生產成本,對標準語法的支援反而沒那麼重要。不過若是對語法標準充分支援,可以省下許多時間去處理奇奇怪怪的bug。

文章有點舊,BC核心已經到了5.5,GCC已經推出了全新編譯引擎的4.0版,VC也邁入了manage code的新層次。這些編譯器都已經不可同日而語。(我想新的BC和GCC更能充分支援C++標準,而VC離標準說不定更遠,微軟有微軟的想法)。反過來說,拿古老的Turbo C++來作這些測試,應該會慘不忍睹吧

*******************************************************************
C++ Primer 答客問 (27) 【標準與實作之間】

PC 環境上三種編譯器對 C++ Standard 的支援

侯捷  jjhou@ccca.nctu.edu.tw
1999.12.29 第一次發表於
清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook)

本文將於日後整理於 侯捷網站/答客問 /C++ Primer 中文版
侯捷網站:www.jjhou.com
----------------------------------------------------------------

●C++ Standard 相容編譯器

我想很多人關心,目前市面上哪些廠牌的 C++ 編譯器,完全支援 C++ Standard。C/C++ User Journal, Nov. 1999 的【C/C++ Stanadrd FAQ】專欄中,P.J. Plauger 對此問題的回答是:目前還沒有完全支援 C++ Standard 的編譯器產品。P.J. Plauger 閱歷廣泛,他的文章提到不同平台上的多種C++ 編譯器(但並沒有深入談論,都只淺淺帶過)。

回憶歷史,C Standard 定案後,市面上立刻出現一大堆宣稱與標準規格完全相容 的 C 編譯器。為什麼符合 C++ 標準規格的編譯器卻是如此難產呢?我想因素之一是,C++ 遠比 C 複雜得多,後期導入的一些性質(如 member templates, template partial specialization...)在編譯器技術層面上更是高難度。因素之二是,C++ Standard library 是個浩大的工程,而編譯器通常是以 bundle 的方式搭配其他公司的 C++ Standard Library,所以彼此的進度、技術、相容性都需要更多時間來協調配合。因素之三是,C++ 編譯器的價值比較,已經不再只是單純地比誰對 C++ Standard 的支援程度高(或甚至也不是比較誰的編譯速度快),而是比較在特定平台上對客戶是否有更多的企業服務。拿 Windows 環境上的 C++ 編譯器來說,「誰提供更好的 Windows 應用軟體開發工具與開發資源」可能比「誰更貼近 C++ Standard」,對客戶而言更為重要。

但是大家還是會很關心哪家編譯器最貼近 C++ Standard -- 即使這不影響你對 C++ 編譯器的選擇。

●個人經驗

自從我將 L&L(Lippman & Lajoie)的《C++ Primer》譯出後,面對 C++ Standard 所規範的許多嶄新性質,就有一股躍躍欲試的衝動。其後由於個人興趣,也因為課程需要,把《C++ Primer 中文版》整個重新檢閱一遍,並動手在三種不同的編譯器上進行測試(都是 PC/Windows 平台)。以下整理我的個人經驗,供各位參考。

我儘量為每一個主題列出一份簡短而完整的測試碼。這些或許不是太嚴謹的測試,但是如果這些符合 C++ Standard 的程式碼無法通過編譯,我們說這個編譯器未能奉行 C++ Standard,並不過份。但反過來說,通過我所列之簡易測試者,或許仍有可能在更複雜的情況中出錯(尤其是template 相關主題)。如果您有相關經驗,歡迎提供出來造福大家。

沒有什麼好點子,可以對以下各個主題編號排序。所以我以它們出現在《C++ Primer 中文版》上的頁次為序。擁有英文版的讀者請注意,中文版和英文版頁次完全相同。


●測試環境

我的測試環境是:Intel Pentium,Windows 98,三套 C++ 編譯器:
(1) Microsoft Visual C++ 6.0(以下以 VC6 代表)
(2) Inprise Borland C++Builder 4.0  (以下以 BCB4 代表)
(3) GNU C++ egcs-2.91.57(以下以 G++ 代表)

請注意,GNU C++ 有著各種作業平台上的各種版本。我只用手上的egcs-2.91.57(for win32) 來測試。

我在 Windows 98 文字模式(console mode)底下進行編譯。以下是三種編譯器的環境設定(其中路徑可能與你不同。如欲循此方式設定,請自行修改):

★VC6 環境設定
@echo off
rem
set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
set INCLUDE=C:\MSDEV\VC98\INCLUDE
set LIB=C:\MSDEV\VC98\LIB

★BCB4 環境設定
@echo off
rem
set PATH=C:\inprise\CBuilder4\BIN
set INCLUDE=C:\inprise\CBuilder4\INCLUDE
set LIB=C:\inprise\CBuilder4\LIB

★G++ egcs-2.91.57 環境設定
@echo off
rem
set PATH=c:\CYGNUS\CYGWIN~1\H-I586~1\BIN
set INCLUDE=
set LIB=
cls

我的編譯選項(compile options)極其簡單,

★VC6  : cl -GX test.cpp
★BCB4 : bcc32 test.cpp
★G++  : g++ -o test.exe test.cpp


●發表

我把這份內容放在 BBS/News 上,歡迎傳佈,無需特別知會。

歡迎以下的討論與指正:

1. 如果加上任何編譯選項(compile options)即可解決(避免)所列之任何一個錯誤的話,歡迎(敬請)告知。
2. 如果我的文字或程式碼有任何問題,歡迎(敬請)告知。
3. 如果您有其他(未列於本文)的編譯器問題,歡迎(敬請)告知。

歡迎於 BBS/News 上討論。如能同時轉寄一份給我,以免除我遺漏觀看的可能,最是感謝。如不欲公開討論,亦歡迎將意見直接 email 給我。如欲討論,請寫實例,不要只是臆測。

我會註明對本文有助之朋友的大名及其意見,以示感謝。


■C++ Primer p213 下, p.393 下
主題:for loop 的 init-statement 區域內,所有 objects 皆為 local。
測試結果:VC6[x]  BCB4[o]  G++[o]
實例:

#001 void main()
#002 {
#003 for (int ival=0; ival< 10; ++ival);
#004 for (int ival=0; ival< 10; ++ival);
#005 }

注意:C/C++ User Journal, Oct.1999, p.94 曾提過在 VC 上的一個簡易
閃避辦法,這並且也是明載於 MSDN News(Vol7, Num6, Dr. GUI column)
上的作法。設計一個巨集如下即可解決:

#define for   if(0); else for

該文並說,在簡單情況下可以有效運作,但並未測試太過複雜的情況。


■C++ Primer p262 中
主題:STL list 建構時,直接給 list 的大小及初值(做為所有元素的相同初值)
測試結果:VC6[o]  BCB4[x]  G++[o]
實例:

#001 #include <list>
#002 ...
#003 const int list_size = 64;
#004 list<int> ilist1(list_size);      // BCB4 error.  VC6 ok. G++ ok
#005 list<string> ilist2(list_size);   // BCB4 ok.     VC6 ok. G++ ok
#006 list<int> ilist3(list_size, -1);  // BCB4 ok.     VC6 ok. G++ ok
#007 list<int> ilist4(list_size, 0);   // BCB4 error   VC6 ok. G++ ok
#008 list<int> ilist5(list_size, 1);   // BCB4 error   VC6 ok. G++ ok
#009 list<int> ilist6(list_size, -6);  // BCB4 ok.     VC6 ok. G++ ok

歸納:看來似乎 BCB4 不允許讓 list<int> 只獲得一個引數,也不允許
list<int> 獲得正值初值。很奇怪的行為。我疏忽了什麼嗎?

2001/08/22 補充:
BCB5[o]. 謝謝 Lianchao Xu




■C++ Primer p383 上
主題:透過指向「函式指標陣列」的指標,喚起該陣列中的函式指標,
      其型式有簡略式和明顯式兩種。
測試結果:VC6[x]  BCB4[x]  G++[x]  (都不支援簡略型式)
實例:

#001 #include <iostream.h>
#002
#003 typedef int (*PFV)();
#004 int f1() { return 1; }
#005 int f2() { return 2; }
#006
#007 PFV fFuncs[2] = { f1, f2 };
#008 PFV (*pfFuncs)[2] = &fFuncs;
#009
#010 void main()
#011 {
#012   cout << fFuncs[0]() << endl;  // 1
#013   cout << fFuncs[1]() << endl;  // 2
#014
#015   cout << pfFuncs[0]() << endl;  // 簡略式,VC6[x]  BCB4[x]  G++[x]
#016   cout << ((*pfFuncs)[1])() << endl;  // 2 (明顯式)
#017 }

2001/08/22 補充:
Lianchao Xu 建議我把:
#008 PFV (*pfFuncs)[2] = &fFuncs;
改為:
#008 PFV *pfFuncs = fFuncs;

再把:
#015   cout << pfFuncs[0]() << endl;  // 簡略式,VC6[x]  BCB4[x]  G++[x]
#016   cout << ((*pfFuncs)[1])() << endl;  // 2 (明顯式)
改為:
#015   cout << (*pfFuncs[0])() << endl;  // 1
#016   cout << (*pfFuncs[1])() << endl;  // 2

測試結果:VC6[o]  BCB4[o]  G++[o]
謝謝。不過這並不是我的測試初衷
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2024-4-29 07:59 , Processed in 0.122748 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表