溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++頭文件有哪些規(guī)則

發(fā)布時間:2021-07-20 11:44:07 來源:億速云 閱讀:147 作者:Leah 欄目:編程語言

C++頭文件有哪些規(guī)則,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

C++中的C++頭文件是用戶應(yīng)用程序和函數(shù)庫之間的橋梁和紐帶,在整個軟件中,頭文件不是最重要的部分,但它是C++語言家族中不可缺少的組成部分,有了它給技術(shù)人員提供了大大的便捷。

因為一個頭文件的內(nèi)容實際上是會被引 入到多個不同的.cpp文件中的,并且它們都會被編譯。放聲明當(dāng)然沒事,如果放了定義,那么也就相當(dāng)于在多個文件中出現(xiàn)了對于一個符號(變量或函數(shù))的定 義,縱然這些定義都是相同的,但對于編譯器來說,這樣做不合法。

所以,應(yīng)該記住的一點就是,.h頭文件中,只能存在變量或者函數(shù)的聲明, 而不要放定義。即,只能在C++頭文件中寫形如:extern int a;和void f();的句子。這些才是聲明。如果寫上int a;或者void f() {}這樣的句子,那么一旦這個頭文件被兩個或兩個以上的.cpp文件包含的話,編譯器會立馬報錯。(關(guān)于extern,前面有討論過,這里不再討論定義跟 聲明的區(qū)別了。)

但是,這個規(guī)則是有三個例外的。

一,頭文件中可以寫const對象的定義。因為全局的const對象默 認(rèn)是沒有extern的聲明的,所以它只在當(dāng)前文件中有效。把這樣的對象寫進(jìn)頭文件中,即使它被包含到其他多個.cpp文件中,這個對象也都只在包含它的 那個文件中有效,對其他文件來說是不可見的,所以便不會導(dǎo)致多重定義。同時,因為這些.cpp文件中的該對象都是從一個頭文件中包含進(jìn)去的,這樣也就保證 了這些.cpp文件中的這個const對象的值是相同的,可謂一舉兩得。同理,static對象的定義也可以放進(jìn)C++頭文件

二,C++頭文件中可 以寫內(nèi)聯(lián)函數(shù)(inline)的定義。因為inline函數(shù)是需要編譯器在遇到它的地方根據(jù)它的定義把它內(nèi)聯(lián)展開的,而并非是普通函數(shù)那樣可以先聲明再鏈 接的(內(nèi)聯(lián)函數(shù)不會鏈接),所以編譯器就需要在編譯時看到內(nèi)聯(lián)函數(shù)的完整定義才行。

如果內(nèi)聯(lián)函數(shù)像普通函數(shù)一樣只能定義一次的話,這事兒就難辦了。因為在 一個文件中還好,我可以把內(nèi)聯(lián)函數(shù)的定義寫在最開始,這樣可以保證后面使用的時候都可以見到定義;但是,如果我在其他的文件中還使用到了這個函數(shù)那怎么辦呢?

這幾乎沒什么太好的解決辦法,因此C++規(guī)定,內(nèi)聯(lián)函數(shù)可以在程序中定義多次,只要內(nèi)聯(lián)函數(shù)在一個.cpp文件中只出現(xiàn)一次,并且在所有的.cpp文 件中,這個內(nèi)聯(lián)函數(shù)的定義是一樣的,就能通過編譯。那么顯然,把內(nèi)聯(lián)函數(shù)的定義放進(jìn)一個頭文件中是非常明智的做法。

三,頭文件中可以寫類 (class)的定義。因為在程序中創(chuàng)建一個類的對象時,編譯器只有在這個類的定義完全可見的情況下,才能知道這個類的對象應(yīng)該如何布局,所以,關(guān)于類的 定義的要求,跟內(nèi)聯(lián)函數(shù)是基本一樣的。

所以把類的定義放進(jìn)C++頭文件,在使用到這個類的.cpp文件中去包含這個C++頭文件,是一個很好的做法。在這里,值得一提 的是,類的定義中包含著數(shù)據(jù)成員和函數(shù)成員。

數(shù)據(jù)成員是要等到具體的對象被創(chuàng)建時才會被定義(分配空間),但函數(shù)成員卻是需要在一開始就被定義的,這也就 是我們通常所說的類的實現(xiàn)。一般,我們的做法是,把類的定義放在頭文件中,而把函數(shù)成員的實現(xiàn)代碼放在一個.cpp文件中。這是可以的,也是很好的辦法。

不過,還有另一種辦法。那就是直接把函數(shù)成員的實現(xiàn)代碼也寫進(jìn)類定義里面。在C++的類中,如果函數(shù)成員在類的定義體中被定義,那么編譯器會視這個函數(shù)為 內(nèi)聯(lián)的。因此,把函數(shù)成員的定義寫進(jìn)類定義體,一起放進(jìn)頭文件中,是合法的。

注意一下,如果把函數(shù)成員的定義寫在類定義的C++頭文件中,而沒有寫進(jìn)類定義中, 這是不合法的,因為這個函數(shù)成員此時就不是內(nèi)聯(lián)的了。一旦頭文件被兩個或兩個以上的.cpp文件包含,這個函數(shù)成員就被重定義了。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI