Re: [問題] cstdlib相關問題
→
09/01 16:50,
09/01 16:50
其實 iostream, string, cstdlib 這些東西
任何你寫在 #include <這裡> 的東西
都叫做 header file, 它們是實際存在你硬碟的檔案
因此你的硬碟裡,一定有個檔案叫做 iostream
(VS 2008 預設在 C:\Program Files\Microsoft Visual Studio 9.0\VC\include)
而 #include <iostream> 這個動作,其實就是
把 iostream 這個檔案的所有內容,一字不漏貼上,替換 #include <iostream> 這行
換句話說,如果你看 #include <iostream> 這行很不爽的話
可以從硬碟裡找出 iostream 這個檔案,整個複製貼上到你的程式碼裡,意義是一樣的
(不過好像比較累 XDD 。而且 iostream 很大,你的程式會變得超亂)
那幹嘛要把 iostream 貼到你的程式碼裡呢?
因為編譯器說:「你要用任何東西之前,要先讓我知道那是什麼東西」
譬如說如果你寫 cout << "Hello World"; 的話
C++ 一定要你交待清楚,cout 這個東西到底是什麼,不然它一定不會讓你過關
如果沒寫 #include <iostream> 而使用了 cout, 可能會看到類似的東西:
錯誤 1 error C2065: 'cout' : 未宣告的識別項
這行的意義就跟「'cout'是三小,我看不懂啦」差不多
因此答案就很清楚了,cout 這個東西是什麼,在 iostream 這個檔案裡有交待
你只要把 iostream 這個檔案「貼」(include)到你的程式碼前面,編譯就會過關。
但是故事還沒結束。
iostream 裡面,事實上只會交待「cout 長得什麼樣子」
而不會有「cout 的內部程式碼」,因此程式仍然無法執行
(不相信的話可以去看看,iostream 裡應該找不到 cout 內部真正做了什麼)
在你的程式碼編譯後,需要透過一個叫做「連結」的動作
這個動作會到你硬碟的某些特定目錄,找到 cout 內部程式碼所編譯出來的檔案
然後把這個檔案裡的程式碼(事實上是機器碼)跟你的程式結合在一起,變成可執行檔
上面那段用講的很玄,畫成圖就是這樣:
(合格的計概課本都會有類似的圖 XD)
白色:動作 紫色:檔案 黃色:說明箭頭指的那個檔案
iostream←這是compiler會附給你的檔案
│include
↓ 你做的編譯
你的 helloworld.cpp ────→ helloworld.obj ────→ helloworld.exe
↑這是你寫的程式 ↑↑這檔案叫object file ↑最後可執行的檔案
│連結
compiler提供的 早就做好的編譯 │
cout程式碼 ──────→ 內含有cout程式碼的library
↑你不一定會有這個檔案 ↑你一定會有這個檔案,它也是object file
唔,我應該再把這張簡陋的圖說清楚一點,但是有點懶了 XD
有問題可以再發問,或者請參考《深入淺出hello world》《程式設計師的基本素養》等
--
硬是不提那個 library 的檔名,是因為我不想把 DLL 拉進來...XD
還有,我怎麼老是在回答這種問題...XD
include相關說明,也可以另外參考:#1C7ImQKI (C_and_CPP)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
推
09/01 19:23, , 1F
09/01 19:23, 1F
推
09/01 20:23, , 2F
09/01 20:23, 2F
推
09/01 20:25, , 3F
09/01 20:25, 3F
推
09/01 20:29, , 4F
09/01 20:29, 4F
→
09/01 20:32, , 5F
09/01 20:32, 5F
→
09/01 20:33, , 6F
09/01 20:33, 6F
→
09/01 20:33, , 7F
09/01 20:33, 7F
→
09/01 20:35, , 8F
09/01 20:35, 8F
推
09/01 20:35, , 9F
09/01 20:35, 9F
→
09/01 20:35, , 10F
09/01 20:35, 10F
→
09/01 20:36, , 11F
09/01 20:36, 11F
→
09/01 20:38, , 12F
09/01 20:38, 12F
推
09/01 20:38, , 13F
09/01 20:38, 13F
→
09/01 20:48, , 14F
09/01 20:48, 14F
→
09/01 20:49, , 15F
09/01 20:49, 15F
→
09/01 20:49, , 16F
09/01 20:49, 16F
→
09/01 20:49, , 17F
09/01 20:49, 17F
→
09/01 20:49, , 18F
09/01 20:49, 18F
→
09/01 20:52, , 19F
09/01 20:52, 19F
→
09/01 20:52, , 20F
09/01 20:52, 20F
→
09/01 20:52, , 21F
09/01 20:52, 21F
推
09/01 20:53, , 22F
09/01 20:53, 22F
→
09/01 20:53, , 23F
09/01 20:53, 23F
→
09/01 20:54, , 24F
09/01 20:54, 24F
→
09/01 20:54, , 25F
09/01 20:54, 25F
→
09/01 20:54, , 26F
09/01 20:54, 26F
→
09/01 21:01, , 27F
09/01 21:01, 27F
→
09/01 21:02, , 28F
09/01 21:02, 28F
→
09/01 21:02, , 29F
09/01 21:02, 29F
→
09/01 21:03, , 30F
09/01 21:03, 30F
→
09/01 21:04, , 31F
09/01 21:04, 31F
→
09/01 21:04, , 32F
09/01 21:04, 32F
→
09/01 21:07, , 33F
09/01 21:07, 33F
→
09/01 21:07, , 34F
09/01 21:07, 34F
→
09/01 21:07, , 35F
09/01 21:07, 35F
其實沒想到我用 cout 這個例子會引起這麼大的討論
我只是想要舉一個「初學者一定用過的東西」當作例子來說明...XDD
也簡化了很多,譬如我就沒考慮 template, inline 這些因素
真的要認真討論的話,現在哪有人還在用 static linking... XDD
推
09/01 21:41, , 36F
09/01 21:41, 36F
推
09/01 23:27, , 37F
09/01 23:27, 37F
推
09/01 23:32, , 38F
09/01 23:32, 38F
→
09/01 23:32, , 39F
09/01 23:32, 39F
我一直很努力的想寫出很好懂的文耶
期待有一天能夠出版《笨蛋都能學會的C語言》或《笨蛋都能理解的作業系統》之類的書
看來還有努力的空間啊....(笑)
※ 編輯: james732 來自: 140.117.171.46 (09/02 00:00)
推
09/02 00:04, , 40F
09/02 00:04, 40F
→
09/02 00:17, , 41F
09/02 00:17, 41F
推
09/02 08:45, , 42F
09/02 08:45, 42F
推
09/02 08:48, , 43F
09/02 08:48, 43F
推
09/02 09:14, , 44F
09/02 09:14, 44F
推
09/02 13:50, , 45F
09/02 13:50, 45F
推
09/02 14:37, , 46F
09/02 14:37, 46F
討論串 (同標題文章)