定義
A "forward declaration" is a declaration of an entity without an associated definition.
“前向聲明”是沒有關聯定義的實體聲明。
前置聲明的作用
避免重復定義變量
避免引入函數定義/聲明文件,從而函數文件發生更改時不會重新編譯依賴文件
解決循環依賴問題
優點
節約編譯時間,前置聲明了一個類,那么只會編譯這個類,而不會編譯與之同屬一個文件的其它代碼。
處理兩個類互相依賴的問題,兩個類互相包含
//A.h #include"B.h" classA{Bb;}; //B.h #include"A.h" classB{Aa;};
缺點
前置聲明隱藏了依賴關系,頭文件改動時,用戶的代碼會跳過必要的重新編譯過程。
前置聲明可能會被庫的后續更改所破壞。前置聲明函數或模板有時會妨礙頭文件開發者變動其API。比如想改類的名稱,在大型項目中,可以采用兼容做法,將舊類名作為新類名的別名,但是別名不能作為前置聲明,所以需要修改類名則需要修改所有前置聲明了該類的地方,可能來自多個部門的開發人員用過,這就不太好處理了。
前置聲明來自 std:: 的 symbol 時,其行為未定義。
前置聲明的類因為只能使用指針或引用,當刪除一個前置聲明的類的指針時,此行為是未定義的。
很難判斷什么時候該用前置聲明,什么時候該用 #include。極端情況下,用前置聲明代替 #include 可能會悄悄地改變代碼的含義:
//b.h: structB{}; structD:B{}; //good_user.cc: #include"b.h" voidf(B*); voidf(void*); voidtest(D*x){f(x);}//Callsf(B*)
若把#include換成前置聲明,由于聲明時不知道D是B的子類,test()中f(x)就會導致f(void*)被調用,而不是f(B*)。
建議
盡可能避免使用前向聲明。相反,請包含所需的頭文件。
審核編輯:湯梓紅
-
谷歌
+關注
關注
27文章
6223瀏覽量
107523 -
編碼
+關注
關注
6文章
967瀏覽量
55491 -
函數
+關注
關注
3文章
4370瀏覽量
64193
原文標題:谷歌編碼規范的前置聲明
文章出處:【微信號:typedef,微信公眾號:typedef】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論