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