標頭檔案互相包含問題

2021-07-06 07:23:04 字數 2274 閱讀 5531

當我們有兩個類的標頭檔案互相包含時,如果出現乙個類中有另乙個類的物件時,vs就會報這樣的錯error c4430: 缺少型別說明符 - 假定為 int。

test2.h

#ifndef __test2_h__

#define __test2_h__

#include

#include "test1.h"

using

namespace

std;

class test2

;#endif // !1

test1.h
#ifndef __test1_h__

#define __test1_h__

#include

#include "test2.h"

using

namespace

std;

class test1

;#endif // !__test1_h__

test2.cpp
#include "test2.h"

intsub(int a, int b)

test1.cpp
#include "test1.h"

int test1::add(int a, int b)

預處理指令

c\c++標頭檔案在開始一般習慣使用#ifndef…..#define……#endif作為預處理識別符號來防止標頭檔案重複包含,如果不使用標頭檔案就會一直遞迴包含下去,編譯器在編譯test2.h標頭檔案時,遇到了#include "test1.h",就會開啟test1.h進行編譯,這相當於把test1.h的內容放到了#include "test1.h"處,而在編譯test1.h時,又會遇到#include "test2.h",編譯器又會開啟test2.h進行編譯,這樣就會一直遞迴包含下去,所以預編譯指令很有用噠!

回到問題

回到最開始的問題,怎麼解決它呢,問了別人才知道,在test1 a;前面加上class test1;的前置宣告,為什麼要加呢?

對於test1.cpp,test1.cpp包含了test1.h,那麼就會展開test1.h,而test1.h又包含了test2.h,那麼也展開它,那麼現在test1.cpp中就相當於

class test2

;class test1

;int test1::add(int a, int b)

此時問題就顯而易見了,test1 a;之前,根本就沒有發現class test1的類定義,所以要在test2.h中test1 a;之前加前置宣告。

test2.h

#ifndef __test2_h__

#define __test2_h__

#include

#include "test1.h"

using

namespace

std;

class test1;

class test2

;#endif // !1

但是當我們把test2.h的**修改之後又會發現新的問題。

error c2079: 「test2::a」使用未定義的 class「test1」。這裡我們就要討論一下類的前置宣告和包含標頭檔案的區別了。

類的前置宣告與包含標頭檔案的區別

類的前置宣告只是告訴編譯器有test1這種型別,但並沒告訴編譯器類的大小,成員函式,資料成員。而包含標頭檔案則是執行到#include x.h時,馬上去編譯x.h,等於說是包含標頭檔案告訴了編譯器類的所有資訊(大小,成員函式,資料成員)。所以,我們也得知,前置宣告只能用指標來執行,因為指標的大小在編譯器上的確定的。即為在test2類中想要使用test1類的物件,物件必須是指標型別的。test1 *a;

test2.h

#ifndef __test2_h__

#define __test2_h__

#include

#include "test1.h"

using

namespace

std;

class test1;

class test2

;#endif // !1

標頭檔案包含問題

今天在寫 時,用到了五六個資料夾,但是在包含標頭檔案的時候不停的在報錯,因此特地重溫了下標頭檔案的包含 標頭檔案包含符號分為兩種 第一種為 先在當前工程儲存目錄下尋找,再去系統存放目錄取尋找,常用於自定義標頭檔案 第二種為 直接在系統目錄下尋找,未找到則返回錯誤,不會在當前目錄下尋找 因此,當我們需...

關於C 中的標頭檔案互相包含

在c 中一般的程式都會分成標頭檔案和cpp檔案,然後包含不同的標頭檔案可以獲得標頭檔案中的函式的引用,但是這裡就會出現乙個問題就是如果兩個檔案中同時包含了同乙個標頭檔案,例如 a.h中包含了c.h 然後在b.h中 也包含c.h 那麼就會出現上述所提到的重複包含的情況。所以在這裡可以使用乙個 ifnd...

兩個類標頭檔案互相包含

c 中兩個類的標頭檔案互相包含問題 csdn部落格 我們知道,當乙個類 設類a 中包含另乙個類 設類b 的物件時,必須在該檔案中包含另乙個類的標頭檔案,如果兩個類都互用到了對方的物件,理論上就要互相包含標頭檔案,但是這樣是不可取的。貼出 如下 這樣是無法通過編譯的,其原因是它們的標頭檔案互相包含了,...