看板 CSSE 關於我們 聯絡資訊
※ 引述《kaikaii (kai)》之銘言: : ※ 引述《ikjhyu (還沒想到)》之銘言: : : 最近在試一些c++的東西 : : 發現一個奇怪的東西 : : 如下面程式 : : #include <stdio.h> : : void main() : : { : : printf("abc\n"); : : } : : 程式要使用printf() 所以必須include stdio.h檔 : : 而他會去呼叫printf.c : : 但是打開 stdio.h檔 : : 卻到處找不到他有include的敘述 : : 裡面都是一些函式原型的宣告 : : 而沒有真正的函式內容檔 : : 請問有人知道為什麼這樣程式可以執行嗎? : 我剛剛看過了stdio.h stdlib.h 裡都沒有include 其他.h檔 : 又看了VRC那個資料夾中 printf.c的實作 : 我想他應該透過某個方法去連結到VRC中的 .c檔 (stdio.h只是個介面 ?) : 因為VRC 這個資料夾的名字不能被變動 : : 而且把stdio.h檔的內容貼到 : : 程式裡面可以執行再把include敘述拿掉 : : 也可以正常執行... : #include <x.h> 不就是將x.h裡的內容 copy 到目前的程式裡 : 所以既然將x.h的內容都copy 到了程式中 : 那將#include<x.h> 去掉 當然還是能執行 (不拿掉當然可以執行) : 以上是個人拙見 ^^" 本來是覺得 是不是include 了某些檔(如stdio.h) 在編譯的時候, linker會自動的知道要去呼叫哪些檔案 特別是被include檔 (ex:stdio.h)裡面定義的 一些原型函式的具體程式檔案 (ex: printf.c) 所以就把他改成是把stdio.h的內容貼到程式裡面 再把include<stdio.h>敘述拿掉 然後執行看看 結果也可以執行 所以應該不是linker 自己會去找什麼檔案來連結 而是在stdio.h裡面的一些程式碼會告訴linker 該去連結什麼檔案 問題是裡面的程式碼怎麼都看不出有什麼連結的訊息 而且好像沒有"include"之類的敘述... 有點怪.. 如果一般使用者只寫函式原型檔(.h) 而沒有include 函式具體程式檔(.c) 應該是不能執行的吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.59.211.123
bxxl:linker會去指定的object files跟library 裡面找, 59.120.57.250 06/26
bxxl:printf屬於標準函式庫,在library裡面 59.120.57.250 06/26
bxxl:通常你看不到它的source code. 59.120.57.250 06/26
bxxl:還有自己寫的程式一般也不會去include .c檔, 59.120.57.250 06/26
※ 編輯: ikjhyu 來自: 61.59.211.123 (06/27 01:10) ※ 編輯: ikjhyu 來自: 61.59.211.123 (06/27 20:48)