在 C++ 中有一個很重要的概念就是頭文件。
之所以在 C++ 中要使用頭文件,最主要的原因是 C++ 的同一個項目可能有多個源代碼文件,要命的是這些源代碼是分別單獨編譯的。
也就是說,在編譯其中一個文件時,編譯器並不知道其它文件中定義的內容,如類、全局變量等。
這就要求我們必須在要使用某個類、函數或變量的每個文件中聲明它,否則 C++ 是無法找到它的。
例如:假設你寫了一個通用的函數 add,它的定義如下:
1 2 3 4 |
int add(int a, int b) { return a+b; } |
很多文件可能都需要使用加法。假設有一個文件 b.cpp 需要使用這個函數,那么,它必須先聲明它,雖然不需要再重寫。
1 2 |
int add(int a, int b); add(5,5); |
如果有很多文件都要使用這個函數,那么這會變得麻煩,特別的,如果你寫了一個類,那么你需要維護大量的聲明(對於每一個 public 對象),並且如果你的類的定義發生了改變,你可能不得不改變無數個聲明。
所以,C++ 語言提出了頭文件的概念。你只需要在頭文件中聲明一次,在實現文件中定義一次,在所有需要用的文件中,就只需要引用這個頭文件,相當於每個文件都包含了一個聲明。
為了防止頭文件的重復包含,通常應該使用預處理指令 #define (定義符號)、#ifndef(如果沒有定義)、#endif(結束判斷)來書寫頭文件的內容。
請理解如下的例子,它是對上個筆記中的 Xiao 類的改進。
Xiao 類的實現(xiao.cpp)
1 2 3 4 5 6 7 8 9 10 11 |
#include "xiao.h" bool Xiao::MobaiXiao() { return this->mobai("xiao", 10000); // 正確 } bool Xiao::mobai(char* cowname, int mobai_times) { // 膜拜神牛。 return true; } |
Xiao.h 頭文件
1 2 3 4 5 6 7 8 9 10 |
#ifndef XIAO_H #define XIAO_H class Xiao { public: bool MobaiXiao(); private: bool mobai(char* cowname, int mobai_times); }; #endif |
主程序:
1 2 3 4 5 6 7 8 9 |
#include "xiao.h" int main() { (Xiao()).MobaiXiao (); // 正確 //(Xiao()).mobai ("xiao", 10000); // 錯誤 return 0; } |
