作者LPH66 (1597463007)
看板C_and_CPP
標題Re: [問題] 為何include <XXX.h> 就能 work ?
時間Fri Aug 8 04:22:12 2014
※ 引述《qas612820704 (Lego)》之銘言:
: 舉一個例就是 當我
: #include <stdio.h> 時
: 就能使用printf 為什麼?
: 這個問題疑惑我很久
: 如果是使用一些已經寫好檔案
: 那麼那些檔案是在哪裡?
: 而它又是在哪一個compiler階段時work的?
: 我搜尋板上 /include 的內容 沒有找到類似的內容
: 希望板上的朋友能幫我解惑 <(_ _)>
: → bleed1979:http://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_2.html 08/08 02:53
這連結只有回答到前半段
引入標頭檔就能使用沒錯, 但那只是編譯階段的事情
在連結階段才會真正把 printf 的程式碼給加進你的程式裡
以我以前在版上用過的一個比喻來說
標頭檔內容就是電路元件說明書
你必須照著說明書所記載的在電路中留下接頭 (即是函式宣告)
編譯器會幫你檢查接頭留的對不對 (檢查函式呼叫)
而連結器才會真正把元件給接上去 (把程式連結起來)
延伸講下去, printf 的內容其實是放在一大包最常用的元件庫裡的
這個元件庫叫做 C standard library, C 標準函式庫
http://zh.wikipedia.org/wiki/C%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB
C 語言規定所有它的實作都必須提供這個函式庫給使用者連結
也因為如此, 在連結時不必額外指定什麼東西
預設就會自動的把標準函式庫裡的東西給連結進去
於是接頭有了 (標頭檔),接上去的元件有了 (自動連結的標準函式庫)
你就可以使用 printf 印字了
這些檔案通常會放在編譯器程式的附近
以你問的 gcc 來說它叫做 libc.a / libc.so
如上所言這個函式庫即使不下 -lc 也會自動連結進來
VC 裡的也叫差不多的名字, 有一些細項參數在檔名裡
不過大致上還是叫做 libcxxx.lib
--
い
ああオレたちには見えてるモノがあるbデ きっと誰にも奪われないモノがあるはずさ
け
開口一番一虚一実跳梁跋扈形影相弔yュL羊頭狗肉東奔西走国士無双南柯之夢 歪も
ぶ
意味がないと思えるコトがある ラPきっとでも意図はそこに必ずある んの
く
依依恋恋空前絶後疾風怒濤有無相生 ラH急転直下物情騷然愚者一得相思相愛 だが
ろ
無意味じゃない ラ6あの意図が 恋た
で
有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407442935.A.ABC.html
推 art1:推! 08/08 08:29
推 iloveyouever:推,簡單易懂 08/08 08:43
推 qas612820704:我想請問一下關於load libarary有相關的load path嗎 08/08 12:36
→ qas612820704:?如果有我要怎麼得知這個path? 08/08 12:36
→ uranusjr:如果是 GCC 的話, 用 gcc -v [filename] -Wl,-v 來編譯 08/08 13:43
→ uranusjr:就會吐預設的 include 和 linker search paths 08/08 13:43
推 lc85301:太神啦OAO 08/08 13:55
推 nakabin:推 08/09 01:44
推 KAOKAOKAO:推 08/09 19:03
→ ah7675:推程式設計師的自我修養這本書 08/09 21:54
→ Killercat: 很適合當睡前讀物 可以當小故事來看 不過需要點功力 08/11 09:24