



全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1. 頭文件用于聲明而不是用于定義當(dāng)設(shè)計頭文件時,記住定義和聲明的區(qū)別是很重要的。定義只可以出現(xiàn)一次,而聲明則可以出現(xiàn)多次(2.3.5節(jié))。下列語句是一些定義,所以不應(yīng)該放在頭文件里:extern int ival = 10; / initializer, so its a definitiondouble fica_rate; / no extern, so its a definition雖然ival聲明為extern,但是它有初始化式,代表這條語句是一個定義。類似地,fica_rate的聲明雖然沒有初始化式,但也是一個定義,因為沒有關(guān)鍵字extern。同一個程序中有兩個以上文件含有上述任一個定義都會導(dǎo)致多重定義鏈接錯誤。因為頭文件包含在多個源文件中,所以不應(yīng)該含有變量或函數(shù)的定義。對于頭文件不應(yīng)該含有定義這一規(guī)則,有三個例外。頭文件可以定義類、值在編譯時就已知道的const對象和inline函數(shù)(7.6節(jié)介紹inline函數(shù))。這些實體可在多個源文件中定義,只要每個源文件中的定義是相同的。在頭文件中定義這些實體,是因為編譯器需要它們的定義(不只是聲明)來產(chǎn)生代碼。例如:為了產(chǎn)生能定義或使用類的對象的代碼,編譯器需要知道組成該類型的數(shù)據(jù)成員。同樣還需要知道能夠在這些對象上執(zhí)行的操作。類定義提供所需要的信息。在頭文件中定義const對象則需要更多的解釋。2. 一些const對象定義在頭文件中回想一下,const變量(2.4節(jié))默認(rèn)為定義該變量的文件的局部變量。正如我們現(xiàn)在所看到的,這種默認(rèn)的原因在于允許const變量定義在頭文件中。在C+中,有些地方需要放置常量表達式(2.7節(jié))。例如,枚舉成員的初始化式必須是常量表達式。在以后的章節(jié)中將會看到其他需要常量表達式的例子。一般來說,常量表達式是編譯器在編譯時就能夠計算出結(jié)果的表達式。當(dāng)const整型變量通過常量表達式自我初始化時,這個const整型變量就可能是常量表達式。而const變量要成為常量表達式,初始化式必須為編譯器可見。為了能夠讓多個文件使用相同的常量值,const變量和它的初始化式必須是每個文件都可見的。而要使初始化式可見,一般都把這樣的const變量定義在頭文件中。那樣的話,無論該const變量何時使用,編譯器都能夠看見其初始化式。但是,C+中的任何變量都只能定義一次(2.3.5小節(jié))。定義會分配存儲空間,而所有對該變量的使用都關(guān)聯(lián)到同一存儲空間。因為const對象默認(rèn)為定義它的文件的局部變量,所以把它們的定義放在頭文件中是合法的。這種行為有一個很重要的含義:當(dāng)我們在頭文件中定義了const變量后,每個包含該頭文件的源文件都有了自己的const變量,其名稱和值都一樣。當(dāng)該const變量是用常量表達式初始化時,可以保證所有的變量都有相同的值。但是在實踐中,大部分的編譯器在編譯時都會用相應(yīng)的常量表達式替換這些const變量的任何使用。所以,在實踐中不會有任何存儲空間用于存儲用常量表達式初始化的const變量。如果const變量不是用常量表達式初始化,那么它就不應(yīng)該在頭文件中定義。相反,和其他的變量一樣,該const變量應(yīng)該在一個源文件中定義并初始化。應(yīng)在頭文件中為它添加extern聲明,以使其能被多個文件共享。習(xí)題 習(xí)題2.31 判別下列語句哪些是聲明,哪些是定義,請解釋原因。 (a) extern int ix = 1024 ; (b) int iy ; (c) extern int iz ; (d) extern const int &ri ;習(xí)題2.32 下列聲明和定義哪些應(yīng)該放在頭文件中?哪些應(yīng)該放在源文件中?并解釋原因。 (a) int var ; (b) const double pi = 3.1416; (c) extern int total = 255 ; (d) const double sq2 = squt (2.0)習(xí)題2.33 確定你的編譯器提供了哪些提高警告級別的選項。使用這些選項重新編譯以前選擇的程序,察看是否會報告新的問題。2.9.2 預(yù)處理器的簡單介紹既然已經(jīng)知道了什么應(yīng)該放在頭文件中,那么我們下一個問題就是真正地編寫頭文件。我們知道要使用頭文件,必須在源文件中#include該頭文件。為了編寫頭文件,我們需要進一步理解#include指示是怎樣工作的。#include設(shè)施是C+預(yù)處理器(preprocessor)的一部分。預(yù)處理器處理程序的源代碼,在編譯器之前運行。C+繼承了C的非常精細(xì)的預(yù)處理器。現(xiàn)在的C+程序以高度受限的方式使用預(yù)處理器。#include指示只接受一個參數(shù):頭文件名。預(yù)處理器用指定的頭文件的內(nèi)容替代每個#include。我們自己的頭文件存儲在文件中。系統(tǒng)的頭文件可能用特定于編譯器的更高效的格式保存。無論頭文件以何種格式保存,一般都含有支持分離編譯所需的類定義及變量和函數(shù)的聲明。1. 頭文件經(jīng)常需要其他頭文件頭文件經(jīng)常#include其他頭文件。頭文件定義的實體經(jīng)常使用其他頭文件的設(shè)施。例如,定義Sales_item類的頭文件必須包含string庫。Sales_item類含有一個string類型的數(shù)據(jù)成員,因此必須可以訪問string頭文件。包含其他頭文件是如此司空見慣,甚至一個頭文件被多次包含進同一源文件也不稀奇。例如,使用Sales_item頭文件的程序也可能使用string庫。該程序不會(也不應(yīng)該)知道Sales_item頭文件使用了string庫。在這種情況下,string頭文件被包含了兩次:一次是通過程序本身直接包含,另一次是通過包含Sales_item頭文件而間接包含。因此,設(shè)計頭文件使其可以多次包含在同一源文件中,這一點很重要。我們必須保證多次包含同一頭文件不會引起該頭文件定義的類和對象被多次定義。使得頭文件安全的通用做法,是使用預(yù)處理器定義頭文件哨兵(header guard)。頭文件哨兵用于避免在已經(jīng)見到頭文件的情況下重新處理該頭文件的內(nèi)容。2. 避免多重包含在編寫頭文件之前,我們需要引入一些額外的預(yù)處理器設(shè)施。預(yù)處理器允許我們自定義變量。預(yù)處理器變量的名字必須在程序中唯一。任何與預(yù)處理器變量相匹配的名字的使用都關(guān)聯(lián)到該預(yù)處理器變量。為了避免名字沖突,預(yù)處理器變量經(jīng)常用全大寫字母表示。預(yù)處理器變量有兩種狀態(tài):已定義或未定義。定義預(yù)處理器變量和檢測其狀態(tài)用到不同的預(yù)處理器指示。#define指示接受一個名字并定義該名字為預(yù)處理器變量。#ifndef指示檢測指定的預(yù)處理器變量是否未定義。如果預(yù)處理器變量未定義,那么跟在其后的所有指令都被處理,直到出現(xiàn)#endif。可以使用這些設(shè)施來預(yù)防多次包含同一頭文件:#ifndef SALESITEM_H#define SALESITEM_H/ Definition ofSales_itemclass and related functions goes here#endif條件指令#ifndef SALESITEM_H測試SALESITEM_H預(yù)處理器變量是否未定義。如果SALESITEM_H未定義,那么#ifndef測試成功,跟在#ifndef后面的所有行都被執(zhí)行,直到發(fā)現(xiàn)#endif。相反,如果SALESITEM_H已定義,那么#ifndef指示測試為假,該指示和#endif指示間的代碼都被忽略。為了保證頭文件在給定的源文件中只處理過一次,我們首先檢測#ifndef。第一次處理頭文件時,測試會成功,因為SALESITEM_H還未定義。下一條語句定義了SALESITEM_H。那樣的話,如果我們編譯的文件恰好又一次包含了該頭文件。#ifndef指示會發(fā)現(xiàn)SALESITEM_H已經(jīng)定義,并且忽略該頭文件的剩余部分。頭文件應(yīng)該含有哨兵,即使這些頭文件不會被其他頭文件包含。編寫頭文件哨兵并不困難,而且如果頭文件被包含多次,它可以避免難以理解的編譯錯誤。當(dāng)沒有兩個頭文件定義和使用同名的預(yù)處理器常量時,這個策略相當(dāng)有效。我們可以為定義在頭文件里的實體(如類)命名預(yù)處理器變量來避免預(yù)處理器變量重名的問題。一個程序只能含有一個名為Sales_item的類。通過使用類名來組成頭文件和預(yù)處理器變量的名字,可以使得很可能只有一個文件將會使用該預(yù)處理器變量。3. 使用自定義的頭文件#include指示接受以下兩種形式:#include #include my_file.h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年三年級語文部編上冊教學(xué)研究計劃
- 2024-2025學(xué)年教導(dǎo)處教育信息管理計劃
- 部編版2025年春季二年級下冊語文教學(xué)指導(dǎo)計劃
- 新生兒結(jié)膜炎護理查房
- 五年級上冊體育教學(xué)計劃
- 醫(yī)療設(shè)備網(wǎng)絡(luò)維護季度總結(jié)和下季度工作計劃
- 工程部員工跨部門培訓(xùn)計劃
- 安全生產(chǎn)綜合知識模擬考試試題卷及答案
- 我的爸爸和媽媽100字11篇
- 新教科版2025年四年級科學(xué)教學(xué)實施計劃
- 2023年二級保密資格評分標(biāo)準(zhǔn)具體操作方法
- GB/T 18362-2008直燃型溴化鋰吸收式冷(溫)水機組
- 社區(qū)工作者經(jīng)典備考題庫(必背300題)
- 2023年陜西韓城象山中學(xué)高一物理第二學(xué)期期末聯(lián)考試題(含答案解析)
- 年產(chǎn)10萬噸污水處理藥劑菌劑項目環(huán)評報告書
- 腎上腺常見疾病影像診斷課件
- 倉庫組長崗位說明書
- (精選word)2019《普速鐵路線路修理規(guī)則》
- 高等教育心理學(xué)知識考核題庫與答案
- JTGT 3832-2018 公路工程預(yù)算定額 說明部分
- 了凡四訓(xùn)-(課堂PPT)課件(PPT 33頁)
評論
0/150
提交評論