今天一開始看一篇幾年前翻譯的google風格規範,知道了前置宣告「可以顯著減少需要包含的標頭檔案數量」,因此搜尋讀了一些文章,最後才發現現在的google風格規範是不推薦使用的。這一篇大概寫了3個小時,然後在剪貼簿被我覆蓋了,重寫花了1個多小時。
「前置宣告」(forward declaration)是類、函式和模板的純粹宣告,沒伴隨著其定義。在類的宣告(.h)檔案中使用另乙個類有兩種方式,一種自然是直接包含標頭檔案,另一種就是前置宣告。
如下,這樣做可以通過編譯,但是為什麼呢。
#pragma once
class bar;
class foo
;
前置宣告要求:其宣告的類是檔案所宣告的類的資料成員時,是指標成員或引用成員(而不是物件成員);其宣告的類是檔案所宣告的類的成員函式的引數或返回值時,該函式在檔案中不存在定義。
其宣告的類是檔案所宣告的類的資料成員時,因為編譯器申請空間時需要其定義,而指標需要的空間固定(引用的實現也基於指標)。
其宣告的類是檔案所宣告的類的成員函式的引數或返回值時,因為函式的宣告並沒有使用到該類的定義,而函式的定義則很大可能使用到該類的定義。但是一般情況下,除非函式定義極短,否則成員函式的宣告和定義一般是分離在.**件和.cpp檔案中的,所以可以說其宣告的類是檔案所宣告的類的成員函式的引數或返回值時可以使用前置宣告。
引用google c++ 風格規範
盡可能地避免使用前置宣告。
注:「跳過重新編譯過程」和「極端情況」應是在在.cpp檔案中使用了前置宣告,最小化include的情況下發生的,個人認為如果只是在.**件中使用前置宣告減少依賴,前置宣告是有益無害的。// b.h:
struct b {};
struct d : b {};
// good_user.cc:
#include "b.h"
void f(b*);
void f(void*);
void test(d* x) // 呼叫 f(b*)
//如果 #include 被 b 和 d 的前置宣告替代, test() 就會呼叫 f(void*) 。
前置宣告最好只在需要時使用,並且不在定義檔案中使用。
google c++ 風格規範(最新)_readthedocs.io
google 程式設計規範(2016.07)_csdn.net
c++中標頭檔案相互包含與前置宣告_cnblogs.com
如何使用前置宣告取代包括標頭檔案_csdn.net
C 前置宣告
特點 被宣告的類不用重新編譯,節省編譯時間 比如a包含乙個指向b的指標,b包含a的乙個例項,這種情況下,使用前置宣告。易錯的點 class date class task1 因為分配器為d分配記憶體的時候,必須要知道 d的大小 主要應用場景是兩個標頭檔案相互包含的場景,建議僅將前置宣告用於解決迴圈引...
C 前置宣告
一般的前置函式宣告 見過最多的前置函式宣告,基本格式 如下 1 include 2 using namespace std 34 void fun char ch,int pvalue,double dvalue 56 void main 714 15void fun char ch,int pva...
C 前置宣告
問題 最近遇到了兩個類a b相互呼叫的情況,於是想當然的在兩個類a和b的標頭檔案中 include 了所需的標頭檔案,當然結果編譯報錯了。為什麼呢,a需要b,b需要a,形成了迴圈,違反了程式的確定性原則。如下圖所示 如這樣相互包含的問題,可以使用前置宣告來解決。即 在標頭檔案中宣告該類,在實現檔案中...