Re: [問題] 為何include <XXX.h> 就能 work ?

作者: LPH66 (-6.2598534e+18f)   2014-08-08 04:22:12
※ 引述《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
作者: art1 (人,原來不是人)   2014-08-08 08:29:00
推!
作者: iloveyouever (佚名)   2014-08-08 08:43:00
推,簡單易懂
作者: qas612820704 (Lego)   2014-08-08 12:36:00
我想請問一下關於load libarary有相關的load path嗎?如果有我要怎麼得知這個path?
作者: uranusjr (←這人是超級笨蛋)   2014-08-08 13:43:00
如果是 GCC 的話, 用 gcc -v [filename] -Wl,-v 來編譯就會吐預設的 include 和 linker search paths
作者: lc85301 (pomelocandy)   2014-08-08 13:55:00
太神啦OAO
作者: nakabin (日落)   2014-08-09 01:44:00
作者: KAOKAOKAO (鬼斗)   2014-08-09 19:03:00
作者: ah7675 (阿毛)   2014-08-09 21:54:00
推程式設計師的自我修養這本書
作者: Killercat (殺人貓™)   2014-08-11 09:24:00
很適合當睡前讀物 可以當小故事來看 不過需要點功力

Links booklink

Contact Us: admin [ a t ] ucptt.com