這個問題實(shí)際上是說,已知頭文件"a.h"聲明了一系列函數(shù)(僅有函數(shù)原型,沒有函數(shù)實(shí)現(xiàn)),"b.cpp"中實(shí)現(xiàn)了這些函數(shù),那么如果我想在"c.cpp"中使用"a.h"中聲明的這些在"b.cpp"中實(shí)現(xiàn)的函數(shù),通常都是在"c.cpp"中使用#include "a.h",那么c.cpp是怎樣找到b.cpp中的實(shí)現(xiàn)呢?
其實(shí).cpp和.h文件名稱沒有任何直接關(guān)系,很多編譯器都可以接受其他擴(kuò)展名。
編譯器預(yù)處理時,要對#include命令進(jìn)行"文件包含處理":將headfile.h的全部內(nèi)容復(fù)制到#include "headfile.h"處。這也正說明了,為什么很多編譯器并不care到底這個文件的后綴名是什么----因為#include預(yù)處理就是完成了一個"復(fù)制并插入代碼"的工作。
程序編譯的時候,并不會去找b.cpp文件中的函數(shù)實(shí)現(xiàn),只有在link的時候才進(jìn)行這個工作。我們在b.cpp或c.cpp中用#include "a.h"實(shí)際上是引入相關(guān)聲明,使得編譯可以通過,程序并不關(guān)心實(shí)現(xiàn)是在哪里,是怎么實(shí)現(xiàn)的。源文件編譯后成生了目標(biāo)文件(.o或.obj文件),目標(biāo)文件中,這些函數(shù)和變量就視作一個個符號。在link的時候,需要在makefile里面說明需要連接哪個.o或.obj文件(在這里是b.cpp生成的.o或.obj文件),此時,連接器會去這個.o或.obj文件中找在b.cpp中實(shí)現(xiàn)的函數(shù),再把他們build到makefile中指定的那個可以執(zhí)行文件中。
a.c a.h b.c中包含a.c的函數(shù) gcc -c b.c 當(dāng)a.c 文件不存在時編譯不通過 怎么回事?
自己寫錯了的緣故 把a(bǔ).h寫成了a.c
實(shí)際測試是對的