hpp檔案與h檔案

2021-07-30 17:16:22 字數 2091 閱讀 8849

提起hpp檔案,或許很多菜鳥會比較陌生,大家只知道.h檔案,但是沒聽過hpp。實際上,hpp檔案是將cpp檔案混入h標頭檔案中,在hpp檔案內,實現與定義都包含在了同乙個檔案中,所以,該類的呼叫者只需要include這個hpp檔案即可,無需再將cpp檔案加到project中進行編譯。而實現**將直接編譯到呼叫者的obj檔案中,不在生成單獨的obj檔案,採用hpp檔案將大幅度減少呼叫project中的cpp檔案數與編譯次數,也不用再發布煩人的lib與dll檔案,所以非常適合用來編寫公開的開源庫。

hpp檔案的優點有很多,但是編寫需要注意以下幾點:

1.hpp即為header plus plus的縮寫

2.與.h檔案類似,hpp檔案是c++的標頭檔案

3.是vcl專用的標頭檔案,已預編譯

4.是一般模板類的標頭檔案

5.一般來說,.h裡面只有宣告,沒有實現。但是hpp檔案裡宣告和實現都有。

6.h標頭檔案裡有using namespace std,但是hpp檔案裡沒有。

7.不可包含全域性物件和全域性函式。

由於hpp本質上是作為h被呼叫者include,所以,當hpp檔案中存在全域性物件或者全域性函式,而該hpp檔案被多個呼叫者include時,將在鏈結時導致符號重定義錯誤。要避免這種情況的話,就得需要去除全域性物件, 並且將全域性函式封裝成類的靜態方法。

8.類之間不可迴圈呼叫

在h和cpp的場景中,當兩個類或者多個類之間有迴圈呼叫關係時,只要預先在標頭檔案做被呼叫類宣告即可,如下所示:

class

b; classa;

class

b;

在hpp場景中,由於定義和實現都存在於乙個檔案中,呼叫者必須明確知道被呼叫者的所有定義,而不能等到cpp中去編譯。因此,hpp檔案中必須整理類之間的呼叫關係,不可產生迴圈呼叫。同理,對於兩個類a和b分別定義在各自的hpp檔案中,形成如下的迴圈呼叫也將導致編譯錯誤。

#include "b.hpp"

class

a;class

b;

9.不可使用靜態成員

靜態成員的使用限制在於如果類中含有靜態成員,則在hpp檔案中必須加入靜態成員的初始化**,當該hpp被多個檔案include時,將會產生符號重定義錯誤。唯一的例外是const static整形成員,因為在vs中,該型別允許在定義時初始化,如:

class

a

由於靜態成員的使用是很常見的場景,無法強制清除,因此可以考慮一下幾種方式(以下示例均為同一類中的方法)

1.類中僅有乙個靜態成員時,且僅有乙個呼叫者時,可以通過局域靜態變數模擬

//方法模擬獲取靜態成員

sometype getmember()

2.類中有多個方法需要呼叫靜態成員,而且可能存在多個靜態成員時,可以將每個靜態成員封裝乙個模擬方法,供其他方法呼叫。

sometype getmembera()

sometype getmemberb()

void accessmembera()

; //獲取兩個靜態成員

void accessstaticmember()

;

3.第二種方法對於大部分情況是通用的,但是當所需的靜態成員過多時,編寫封裝方法的工作量將非常巨大,在此種情況下,建議使用singleton模式,將被呼叫類定義成普通類,然後使用singleton將其變為全域性唯一的物件進行呼叫。

如原h+cpp下的定義如下:

class a

static type member;//靜態成員

}

採用singleton方式,實現**可能如下(singleton實現請自行查閱相關文件)

//實際實現類

class aprovider

type

member;//變為普通成員

}//提供給呼叫者的介面類

class a

}

h與 hpp檔案的區別

c 中的.hpp檔案 hpp,其實質就是將.cpp的實現 混入.h標頭檔案當中,定義與實現都包含在同一檔案,則該類的呼叫者只需要include該hpp檔案即可,無需再 將cpp加入到project中進行編譯。而實現 將直接編譯到呼叫者的obj檔案中,不再生成單獨的obj,採用hpp將大幅度減少呼叫 ...

C 中的 hpp檔案與 h檔案

1 是header plus plus 的簡寫。3 是vc l專用的標頭檔案,已預編譯。4 是一般模板類的標頭檔案。5 一般來說,h裡面只有宣告,沒有實現,而 hpp裡宣告實現都有,後者可以減 少.cpp的數量。6 h裡面可以有using namespace std,而 hpp裡則無。7 hpp要注...

hpp標頭檔案與h標頭檔案的區別

hpp,其實質就是將.cpp的實現 混入.h標頭檔案當中,定義與實現都包含在同一檔案,則該類的呼叫者只需要include該hpp檔案即可,無需再將cpp加入到project中進行編譯。而實現 將直接編譯到呼叫者的obj檔案中,不再生成單獨的obj,採用hpp將大幅度減少呼叫 project中的cpp...