在c++中,關於cpp的標頭檔案互相包含的問題很讓人頭疼,其實我們誰也不願意弄的結構混亂,難以理解,但有時又是有必須的。
假定當前有兩個標頭檔案分別為 a.h 和 b.h,內容分別如下:
a.h內容為:
#ifndef _a_h_
#define _a_h_
#endif
#include "b.h"
class a
public:
b cl_b;
b.h內容為:
#ifndef _b_h_
#define _b_h_
#endif
#include "a.h"
class b
public:
a cl_a;
編寫相應的a.cpp和b.cpp,並編譯,發現有錯誤提示,大意為型別不能找到。為何會出現這種情況?我們知道,c++編譯器在編譯原始檔時採用的是預編譯原則,對每乙個資料總是需要知道其型別及大小。在a物件中要分配一塊屬於b的空間,而b中又有a的空間,是乙個邏輯錯誤,因為在未完成預編譯的情況下無法預知資料所占用的空間大小。
根據指標的特點,指標在定義後並沒有占用實際的記憶體空間,同時我們使用預先宣告的方法,在vc編譯環境下做如下修改:
a.h內容為:
#pragma once
#include "b.h"
class b;
class a
public:
b *cl_b;
b.h內容為:
#pragma once
#include "a.h"
class a;
class b
public:
a *cl_a;
重新編譯,ok,編譯通過。我們發現,前置的宣告還是很有用的,而此種情況下的巨集定義卻不能解決我們的問題。
也看了不少的文章建議標頭檔案的包含應該盡量放在.cpp當中,個人認為還是要從實際的情況來看,如果需要巢狀包含的類,其某些方法經常的被呼叫,就不適合在.cpp中臨時建立、銷毀類物件,因為這種反覆的建立、銷毀類物件,對系統資源是非常浪費的。
這和c#不一樣,c#的不同專案之間是不能相互引用的。
c 標頭檔案相互包含問題
c 中標頭檔案互相包含經常會出現編譯錯誤.示例 如下 h ifndef a h define a h include b.h includeusing namespace std class a endif a h a.cpp include a.h a a a a int a getvala vo...
標頭檔案的相互包含
標頭檔案的相互包含在編譯時如果順序不注意就很容易造成編譯錯誤。遇到乙個標頭檔案,一開始並沒有包含其他標頭檔案而是定義了一些列舉,然後再包含另外乙個標頭檔案,這樣就很類似於 1 1 2 1 1 在1標頭檔案中包含2標頭檔案,預處理時就是以這樣的形式處理交給編譯器,原本的用意是在1標頭檔案的包含2之前的...
解決標頭檔案相互包含問題的方法
所謂超前引用是指乙個型別在定義之前就被用來定義變數和宣告函式。一般情況下,c c 要求所有的型別必須在使用前被定義,但是在一些特殊情況下,這種要求無法滿足,例如,在類cmyview中保留了乙個非模式對話方塊物件指標,該物件用於顯示 修改一些資訊。為了實現對話方塊 應用 按鈕,把對話方塊做的修改立刻更...