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