發信人: jjhou.bbs@bbs.cs.nthu.edu.tw (jjhou) 日期: 20 Jan 2000 07:45:41 GMT 標題: C++ Primer 答客問 (30) - header files & namespace std 信群: tw.bbs.comp.language 看板: programming/A0S8DF95 來源: <3YVC65$iL3@bbs.cs.nthu.edu.tw>:24113, 組織: 清華資訊(楓橋驛站) C++ Primer 答客問 (30) - header files & namespace std 侯捷 jjhou@ccca.nctu.edu.tw 2000.01.20 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) 本文將於日後整理於 侯捷網站/侯捷譯作/C++ Primer 中文版/答客問 侯捷網站:www.jjhou.com ---------------------------------------------------------------- 我在 BBS/Programming 版看到《C++ Primer 中文版》讀者 詢問的幾個問題。都是一些起手問題,雖然我曾經回答過這類問題, 書上也有說明,但是我不能責問讀者為什麼不把書看清楚看明白, 畢竟該書將近 1300 頁。 受困於這些起手問題,想必挫折感很深。因此我稍加整理,再次 回答於下。希望你可以愉快地開始你的第一個 C++ 程式,並立刻 開始使用 C++ Standard Library 帶來的許多便利。 Bjarne Stroustrup 曾經在 Dr. Dobb's Journal, May 1999. 發表一篇文章:Learning Standard C++ as a New Language。 他說,由於 C++ Standard Library 的加入,C++ 的學習方式 應該改變,改為從 C++ Standard Library 提供的各種美妙的 containers、algorithms 入手,獲得愉快的經驗後,再開始 學習 Object-Oriented 和 Generic programming 技術。我有 同感。使用 C++ Standard Library,第一個要緊的是知道含入 些什麼檔,第二個要緊的是知道它們存在於哪個 namespace 中。 1. header files 兩種風格:C-style 有 .h 副檔名,C++-style 則無。過去的 C headers 例如 , ,其對應的 C++-style 檔名為 , ,也就是去除 .h,並加上前置字元 'c'。 所以你可以寫: #include #include 也可以寫: #include #include // 但如果你使用 C++ style,必須突破 namespace std 的束縛。後述。 至於 C++ Standard Library 的 header files,一概沒有 .h 副檔名。 例如: #include #include #include // 這並不是 C-style 省略了 .h 後的結果 #include 你可以在 \msdev\vc98\include 中看到這些「有副檔名」和 「無副檔名」的各個 header files。 你在 \inprise\cbuilder4\include 中看到的 header files, 全部都有 .h 副檔名。這是為什麼?可能是 C++Builder 的前處理器 (preprocessor)將程式中所含入的所有「無副檔名」的各個 header files 都改為「有副檔名」。這大概是為了與過去的碼 相容(在 C++ Standard 未定案之前, 也 是有副檔名的:) 你也會在 \cygnus\cygwin-b20\include\g++ 中看到「有副檔名」 和「無副檔名」的各個 header files。它們都滿小的,事實上 它們內部又含入相應的 stl_xxx header files。例如 含入 含入 。當然, 千萬不要在你的程式中直接含入這些 stl_xxx.h。 2. namespace std C++ Standard Library 提供的所有 components,都被封裝於 名為 std 的這個 namespace 中。要「突破」某個 namespace,有 數種方法。最簡單的一種,就是把它「完全打開」,也就是使用 using directive 如下: using namespace std; // 打開 namespace 'std' 這雖然有一點小小的副作用,但對程式新手而言(或對程式不大, 組織不複雜者而言),夠了。 因此,如果你這麼寫: #include 你用的是過去的(pre-Standard)iostream library。如果你這麼寫: #include using namespace std; 你用的便是 C++ Standard 所規範的 iostream library。 ----------------------------------------------------------------- ★順帶一提,你可能會問 有差嗎? 應該是沒差。但是 VC6 竟然有差。如果你使用 VC6 的 來設計 friend operator<<,你會氣死! 下面節錄「C++ Primer 答客問 (27)」: ■C++ Primer p1090 主題:friend operator<< 測試結果:VC6[x] BCB4[o] G++[o] 注意:如果使用 而不是 ,在 VC6 中 運用 friend 就比較沒有問題。但如果這麼做的話,由於下例 用到 ,一定得 using namespace std; 而這在 VC6 中似乎 導至暗中含入 ,於是與 起衝突。總之, 挖東補西,很煩。VC6 在這主題上表現不佳。 ----------------------------------------------------------------- 《C++ Primer 中文版》的各個範例程式,有一個缺點:它們 通常都未寫出 using namespace std; 這一行。這是源於作者 所使用的編譯平台之故(非標準)。請你記得加上去。 朋友,現在開始享受你的第一個運用 C++ Standard Library 的程式吧。 你已經擁有各種資料結構如 vector, list, stack, queue,...,也擁有 各種演算法如 sort, search, find, copy...。你已經站在巨人的肩膀上了。 --- the end  -- ※ Origin: 楓橋驛站 ◆ Mail: jjhou@ccca.nctu.edu.tw .