今天下午偶然發現乙個錯誤,
比如a.h中有#include"b.h" 且b.h中有#include"a.h"這樣的情況出現時,編譯器報找不到型別的錯誤
語法錯誤: 缺少「;」(在「*」的前面)
缺少型別說明符- 假定為int。注意: c++ 不支援預設int
等等等等
起初以為是標頭檔案重複包含的原因,企圖以#ifndef #define #endif解決,結果無效,後來才知道需要在a.h中有b的前置宣告class b才行,再後來發現只要有class b
#include "b.h"也是不需要的了,這也引發了乙個思考,什麼時候該用前置宣告,什麼時候該用標頭檔案的問題。
不才總結了一下幾條原則:1、
第乙個原則應該是,如果可以不包含標頭檔案,那就不要包含了。這時候前置宣告可以解決問題。如果使用的僅僅是乙個類的指標,沒有使用這個類的具體物件(非指標),也沒有訪問到類的具體成員,那麼前置宣告就可以了。因為指標這一資料型別的大小是特定的,編譯器可以獲知。 2、
盡量在cpp檔案中包含標頭檔案,而非在標頭檔案中。假設類a的乙個成員是是乙個指向類b的指標,在類a的標頭檔案中使用了類b的前置宣告並便宜成功,那麼在a的實現中我們需要訪問b的具體成員,因此需要包含標頭檔案,那麼我們應該在類a的實現部分(cpp檔案)包含類b的標頭檔案而非宣告部分(h檔案)
注意:如果在.h中包含另乙個類的物件,而非指標和引用,必須用標頭檔案。因為前置宣告只是告知確實有這個型別,但型別大小卻不知道,而使用標頭檔案則將這個類的所有成員都暴露出來了。
關於C 中的標頭檔案互相包含
在c 中一般的程式都會分成標頭檔案和cpp檔案,然後包含不同的標頭檔案可以獲得標頭檔案中的函式的引用,但是這裡就會出現乙個問題就是如果兩個檔案中同時包含了同乙個標頭檔案,例如 a.h中包含了c.h 然後在b.h中 也包含c.h 那麼就會出現上述所提到的重複包含的情況。所以在這裡可以使用乙個 ifnd...
標頭檔案互相包含解決 關於多檔案中的重複定義標頭檔案
先上錯誤 標頭檔案 fenshu.h pragma once include include using namespace std class fenshu private int a,b public fenshu int x,int y a x b y void display void yf...
自己關於C 標頭檔案包含的想法
這是我第一次在網上發這種帖子,也不知道自己的這些東西說的對不對。不過自己也不管這些了,對的話那就是一件很幸福的事情 我個人認為 如果不對那就希望有各位高手給予指正。我覺得在c 中,標頭檔案的包含其實說白了就是需要什麼就往裡放什麼。不論是包含標準庫函式的標頭檔案,還是我們自己設計的一些自己需要的標頭檔...