c++ 头文件 .h 理解与实践
頭文件如何來關聯源文件?
這個問題實際上是說,已知頭文件“a.h”聲明了一系列函數(僅有函數原型,沒有函數實現),“b.cpp”中實現了這些函數,那么如果我想在“c.cpp”中使用“a.h”中聲明的這些在“b.cpp”中實現的函數,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎樣找到b.cpp中的實現呢?
其實.cpp和.h文件名稱沒有任何直接關系,很多編譯器都可以接受其他擴展名。
譚浩強老師的《C程序設計》一書中提到,編譯器預處理時,要對#include命令進行“文件包含處理”:將headfile.h的全部內容復制到#include “headfile.h”處。
這也正說明了,為什么很多編譯器并不care到底這個文件的后綴名是什么----因為#include預處理就是完成了一個“復制并插入代碼”的工作。
程序編譯的時候,并不會去找b.cpp文件中的函數實現,只有在link的時候才進行這個工作。我們在b.cpp或c.cpp中用#include “a.h”實際上是引入相關聲明,使得編譯可以通過,程序并不關心實現是在哪里,是怎么實現的。源文件編譯后成生了目標文件(.o或.obj文件),目標文件中,這些函數和變量就視作一個個符號。在link的時候,需要在makefile里面說明需要連接哪個.o或.obj文件(在這里是b.cpp生成的.o或.obj文件),此時,連接器會去這個.o或.obj文件中找在b.cpp中實現的函數,再把他們build到makefile中指定的那個可以執行文件中。
在VC中,一幫情況下不需要自己寫makefile,只需要將需要的文件都包括在project中,VC會自動幫你把makefile寫好。
通常,編譯器會在每個.o或.obj文件中都去找一下所需要的符號,而不是只在某個文件中找或者說找到一個就不找了。因此,如果在幾個不同文件中實現了同一個函數,或者定義了同一個全局變量,鏈接的時候就會提示“redefined”.
代碼在這里
代碼結構
. ├── add.c ├── add_sub.h ├── main.c ├── Makefile └── sub.cMakefile
可以看出代碼是被分別編譯的,最后才被鏈接成一個整體,一個可執行文件 main
main: add.o sub.o main.ogcc add.o sub.o main.o -o mainadd.o: add.c add_sub.hgcc -c add.c -o add.osub.o: sub.c add_sub.hgcc -c sub.c -o sub.omain.o:main.c add_sub.hgcc -c main.c -o main.o clean:rm -rf *.o main總結
以上是生活随笔為你收集整理的c++ 头文件 .h 理解与实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: virtual box挂载 共享文件夹
- 下一篇: ubuntu虚拟机开机无法进入系统(in