定義
A "forward declaration" is a declaration of an entity without an associated definition.
“前向聲明”是沒有關(guān)聯(lián)定義的實體聲明。
前置聲明的作用
避免重復(fù)定義變量
避免引入函數(shù)定義/聲明文件,從而函數(shù)文件發(fā)生更改時不會重新編譯依賴文件
解決循環(huán)依賴問題
優(yōu)點
節(jié)約編譯時間,前置聲明了一個類,那么只會編譯這個類,而不會編譯與之同屬一個文件的其它代碼。
處理兩個類互相依賴的問題,兩個類互相包含
//A.h #include"B.h" classA{Bb;}; //B.h #include"A.h" classB{Aa;};
缺點
前置聲明隱藏了依賴關(guān)系,頭文件改動時,用戶的代碼會跳過必要的重新編譯過程。
前置聲明可能會被庫的后續(xù)更改所破壞。前置聲明函數(shù)或模板有時會妨礙頭文件開發(fā)者變動其API。比如想改類的名稱,在大型項目中,可以采用兼容做法,將舊類名作為新類名的別名,但是別名不能作為前置聲明,所以需要修改類名則需要修改所有前置聲明了該類的地方,可能來自多個部門的開發(fā)人員用過,這就不太好處理了。
前置聲明來自 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*)被調(diào)用,而不是f(B*)。
建議
盡可能避免使用前向聲明。相反,請包含所需的頭文件。
審核編輯:湯梓紅
-
谷歌
+關(guān)注
關(guān)注
27文章
6099瀏覽量
104773 -
編碼
+關(guān)注
關(guān)注
6文章
920瀏覽量
54707 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4256瀏覽量
62223
原文標題:谷歌編碼規(guī)范的前置聲明
文章出處:【微信號:typedef,微信公眾號:typedef】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論