定義
A "forward declaration" is a declaration of an entity without an associated definition.
“前向聲明”是沒有關(guān)聯(lián)定義的實(shí)體聲明。
前置聲明的作用
避免重復(fù)定義變量
避免引入函數(shù)定義/聲明文件,從而函數(shù)文件發(fā)生更改時(shí)不會重新編譯依賴文件
解決循環(huán)依賴問題
優(yōu)點(diǎn)
節(jié)約編譯時(shí)間,前置聲明了一個(gè)類,那么只會編譯這個(gè)類,而不會編譯與之同屬一個(gè)文件的其它代碼。
處理兩個(gè)類互相依賴的問題,兩個(gè)類互相包含
//A.h #include"B.h" classA{Bb;}; //B.h #include"A.h" classB{Aa;};
缺點(diǎn)
前置聲明隱藏了依賴關(guān)系,頭文件改動時(shí),用戶的代碼會跳過必要的重新編譯過程。
前置聲明可能會被庫的后續(xù)更改所破壞。前置聲明函數(shù)或模板有時(shí)會妨礙頭文件開發(fā)者變動其API。比如想改類的名稱,在大型項(xiàng)目中,可以采用兼容做法,將舊類名作為新類名的別名,但是別名不能作為前置聲明,所以需要修改類名則需要修改所有前置聲明了該類的地方,可能來自多個(gè)部門的開發(fā)人員用過,這就不太好處理了。
前置聲明來自 std:: 的 symbol 時(shí),其行為未定義。
前置聲明的類因?yàn)橹荒苁褂弥羔樆蛞?,?dāng)刪除一個(gè)前置聲明的類的指針時(shí),此行為是未定義的。
很難判斷什么時(shí)候該用前置聲明,什么時(shí)候該用 #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換成前置聲明,由于聲明時(shí)不知道D是B的子類,test()中f(x)就會導(dǎo)致f(void*)被調(diào)用,而不是f(B*)。
建議
盡可能避免使用前向聲明。相反,請包含所需的頭文件。
審核編輯:湯梓紅
-
谷歌
+關(guān)注
關(guān)注
27文章
6211瀏覽量
106520 -
編碼
+關(guān)注
關(guān)注
6文章
962瀏覽量
55085 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4355瀏覽量
63319
原文標(biāo)題:谷歌編碼規(guī)范的前置聲明
文章出處:【微信號:typedef,微信公眾號:typedef】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
安富萊C語言編碼規(guī)范
ADS1281 PCM編碼規(guī)范應(yīng)該在哪里找?
AC97和HD聲卡規(guī)范簡介和前置音頻接口的連接
嵌入式c語言編碼規(guī)范
嵌入式c語言編碼規(guī)范
Python編碼規(guī)范分享
請問車載嵌入式軟件如何聲明符合MISRA語言規(guī)范?
HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計(jì)- 隱私聲明
Java Script的編碼規(guī)范詳細(xì)說明

AN-562:過濾ADV719x視頻編碼器內(nèi)部濾波器規(guī)范

評論