c++頭文件的簡單使用

c++的文件分爲兩個部分,頭文件.h和執行文件.cpp,一個c++文件可以由多個頭文件和執行文件組成,頭文件不會被編譯,但它的內容會被編譯,當.cpp文件編譯時,包含的頭文件內容會被合到相應的.cpp文件中進行編譯,c++支持分別編譯,一個.cpp文件中可以使用另一個.cpp的函數,但是它們之間的編譯可以是獨立的,此時只需要在使用的那個.cpp文件中聲明需要的那個函數就行,聲明與定義是不同的兩個概念,聲明只需要寫出函數的形式,表明有這麼個東西就行,定義需要完整地描述函數的實現過程,如果需要聲明的東西太多,我們就可以將它們都放在頭文件裏,這樣,只需要在.cpp裏#include "頭文件名"就可以使用包含的函數了,下面是一個簡單的例子,實現的平臺是linux ubuntu 14.04:

建立三個文檔:main.cpp、print.cpp、header.h,具體內容如下:

-------------main.cpp---------------

#include "header.h"
int main()
{
char ch = 'a';
print(ch);
}

------------print.cpp----------------

#include<iostream>
using namespace std;
void print(char ch)
{
//a ++;
cout << ch << endl;
}

---------header.h-------------

void print(char);

在linux下進入文件所在目錄,然後用“g++ main.cpp -c”和“g++ print.cpp -c”編譯.cpp文件,編譯完成後會生成print.o和main.o兩個目標文件,用“g++ print.o main.o -o ch”進行鏈接,最後用“./ch”運行文件,結果如下:


頭文件中不能出現定義的語句,因爲聲明可以進行多次,但是定義如果進行多次就會出現重定義的問題,試想如果只是在一個.cpp文件包含頭文件還好,如果同時有多個.cpp文件包含同一個頭文件的話,那麼編譯器便不知道應該聽從那個定義了,如下所示,我們在頭文件header.h中定義一個變量a,在main.cpp和print.cpp中同時包含該頭文件,結果在鏈接的時候便會提示重定義問題:


頭文件中只能包含變量或者函數的聲明,如:“extern int a;“和“void f();”,但有三種情況除外,const對象的定義、inline內聯函數的定義、類的定義。

1) const對象默認非extern,只在被包含文件中可見,在其他文件不可見,不會導致重定義,且const值不可更改,所有文件看到的值相同,同理stacic對象也可以定義;

2) 內聯函數不會單獨進行編譯,編譯器會在遇到時進行內聯展開,所以編譯器需要看到內聯函數的完整定義,c++規定,內聯函數可以進行多次定義,但是在一個.cpp文件中只能出現一次,且在所有.cpp文件中定義相同,所以內聯函數可以在頭文件中定義。

3) 編譯器需要在類完全可見的情況下才能對類的對象進行佈局,如,類的內存佈局,一般情況下,把類的定義放在頭文件中,而把函數成員的實現代碼放在一個.cpp文件中。

上述例外可以在不同的源文件多次定義,但是不能在同一個源文件中多次定義,爲了確保同一.cpp文件不會包含多次頭文件的定義,可以在頭文件中使用

#ifndef *** //名字任意取,不重複就好,一般用對應頭文件名的全大寫來表示,如,HEADER_H

#define ***

...

#endif

來保證頭文件不會被重複定義,下面是一個實際的例子,header.h裏面已經包含了temp.h,main.cpp同時包含了header.h和temp.h,不使用#ifndef的結構,temp.h會被重複包含,其中的內容就會重定義,使用#ifndef結構,在編譯前會先檢查temp.h是否已經定義,若定義過則不再定義,可很好地防止重定義的情況。

-------------main.cpp---------------

#include "header.h"
#include "temp.h"
int main()
{
char ch = 'a';
print(ch);
}

------------print.cpp----------------

#include<iostream>
using namespace std;
void print(char ch)
{
cout << ch << endl;
}

---------header.h-------------

#ifndef   _bbb_   
#define   _bbb_ 
#include "temp.h"
void print(char);
class b{};
#endif

---------temp.h--------------

#ifndef   _aaa_   
#define   _aaa_   
class aaa{};  
#endif

--------------------------------


參考文獻:http://www.cnblogs.com/lidabo/archive/2012/04/17/2454568.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章