



全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
#ifdef,#else,#endif,#if用法詳解預(yù)處理就是在進(jìn)行編譯的第一遍詞法掃描和語(yǔ)法分析之前所作的工作。說(shuō)白了,就是對(duì)源文件進(jìn)行編譯前,先對(duì)預(yù)處理部分進(jìn)行處理,然后對(duì)處理后的代碼進(jìn)行編譯。這樣做的好處是,經(jīng)過(guò)處理后的代碼,將會(huì)變的很精短。關(guān)于預(yù)處理命令中的文件包含(i nclude),宏定義(#define),書(shū)上已經(jīng)有了詳細(xì)的說(shuō)明,在這里就不詳述了。這里主要是對(duì)條件編譯(#ifdef,#else,#endif,#if等)進(jìn)行說(shuō)明。以下分3種情況:1:情況1:#ifdef _XXXX.程序段1.#else.程序段2.#endif這表明如果標(biāo)識(shí)符_XXXX已被#define命令定義過(guò)則對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。例:#define NUM.#ifdef NUMprintf(之前NUM有過(guò)定義啦!:) n);#elseprintf(之前NUM沒(méi)有過(guò)定義!:( n);#endif如果程序開(kāi)頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時(shí)候,當(dāng)然執(zhí)行第一個(gè)printf。否則第二個(gè)printf將被執(zhí)行。我認(rèn)為,用這種,可以很方便的開(kāi)啟/關(guān)閉整個(gè)程序的某項(xiàng)特定功能。2:情況2:#ifndef _XXXX.程序段1.#else.程序段2.#endif這里使用了#ifndef,表示的是if not def。當(dāng)然是和#ifdef相反的狀況(如果沒(méi)有定義了標(biāo)識(shí)符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)。3:情況3:#if 常量.程序段1.#else.程序段2.#endif這里表示,如果常量為真(非0,隨便什么數(shù)字,只要不是0),就執(zhí)行程序段1,否則執(zhí)行程序段2。我認(rèn)為,這種方法可以將測(cè)試代碼加進(jìn)來(lái)。當(dāng)需要開(kāi)啟測(cè)試的時(shí)候,只要將常量變1就好了。而不要測(cè)試的時(shí)候,只要將常量變0。# ifdef #ifndef 等用法 文件中的#ifndef頭件的中的#ifndef,這是一個(gè)很關(guān)鍵的東西。比如你有兩個(gè)C文件,這兩個(gè)C文件都include了同一個(gè)頭文件。而編譯時(shí),這兩個(gè)C文件要一同編譯成一個(gè)可運(yùn)行文件,于是問(wèn)題來(lái)了,大量的聲明沖突。還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會(huì)不會(huì)被多個(gè)文件引用,你都要加上這個(gè)。一般格式是這樣的:#ifndef #define .#endif在理論上來(lái)說(shuō)可以是自由命名的,但每個(gè)頭文件的這個(gè)“標(biāo)識(shí)”都應(yīng)該是唯一的。標(biāo)識(shí)的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h#ifndef _STDIO_H_#define _STDIO_H_.#endif2.在#ifndef中定義變量出現(xiàn)的問(wèn)題(一般不定義在#ifndef中)。#ifndef AAA#define AAA.int i;.#endif里面有一個(gè)變量定義在vc中鏈接時(shí)就出現(xiàn)了i重復(fù)定義的錯(cuò)誤,而在c中成功編譯。結(jié)論:(1).當(dāng)你第一個(gè)使用這個(gè)頭的.cpp文件生成.obj的時(shí)候,int i 在里面定義了當(dāng)另外一個(gè)使用這個(gè)的.cpp再次單獨(dú)生成.obj的時(shí)候,int i 又被定義然后兩個(gè)obj被另外一個(gè).cpp也include 這個(gè)頭的,連接在一起,就會(huì)出現(xiàn)重復(fù)定義.(2).把源程序文件擴(kuò)展名改成.c后,VC按照C語(yǔ)言的語(yǔ)法對(duì)源程序進(jìn)行編譯,而不是C+。在C語(yǔ)言中,若是遇到多個(gè)int i,則自動(dòng)認(rèn)為其中一個(gè)是定義,其他的是聲明。(3).C語(yǔ)言和C+語(yǔ)言連接結(jié)果不同,可能(猜測(cè))時(shí)在進(jìn)行編譯的時(shí)候,C+語(yǔ)言將全局變量默認(rèn)為強(qiáng)符號(hào),所以連接出錯(cuò)。C語(yǔ)言則依照是否初始化進(jìn)行強(qiáng)弱的判斷的。(參考)解決方法:(1).把源程序文件擴(kuò)展名改成.c。(2).推薦解決方案:.h中只聲明 extern int i;在.cpp中定義#ifndef _X_H_#define _X_H_extern int i;#endif /_X_H_int i;注意問(wèn)題:(1).變量一般不要定義在.h文件中。ifndef/define/endif的用法與實(shí)例分析用法:.h文件,如下:#ifndef XX_H#define XX_H#endif這樣如果有兩個(gè)地方都包含這個(gè)頭文件,就不會(huì)出現(xiàn)兩次包含的情況,因?yàn)樵诘诙伟瑫r(shí)XX_H已經(jīng)有定義了,所以就不再 include了。-#ifndef GRAPHICS_H / 防止graphics.h被重復(fù)引用#define GRAPHICS_H#include / 引用標(biāo)準(zhǔn)庫(kù)的頭文件#include “myheader.h” / 引用非標(biāo)準(zhǔn)庫(kù)的頭文件void Function1(); / 全局函數(shù)聲明class Box / 類結(jié)構(gòu)聲明;#endif-假設(shè)你的工程里面有4個(gè)文件,分別是a.cpp,b.h,c.h,d.ha.cpp的頭部是:#include b.h #include c.h b.h和c.h的頭部都是:#include d.h 而d.h里面有class D的定義。這樣一來(lái),編譯器編譯a.cpp的時(shí)候,先根據(jù)#include b.h 去編譯b.h這個(gè)問(wèn)題,再根據(jù)b.h里面的#include d.h ,去編譯d.h的這個(gè)文件,這樣就把d.h里面的class D編譯了;然后再根據(jù)a.cpp的第二句#include c.h ,去編譯c.h,最終還是會(huì)找到的d.h里面的class D,但是class D之前已經(jīng)編譯過(guò)了,所以就會(huì)報(bào)重定義錯(cuò)誤。加上ifndef/define/endif,就可以防止這種重定義錯(cuò)誤。-1.比如你有兩個(gè)C文件,這兩個(gè)C文件都include了同一個(gè)頭文件。而編譯時(shí),這兩個(gè)C文件要一同編譯成一個(gè)可運(yùn)行文件,于是問(wèn)題來(lái)了,大量的聲明沖突。還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會(huì)不會(huì)被多個(gè)文件引用,你都要加上這個(gè)。一般格式是這樣的:#ifndef #define .#endif 在理論上來(lái)說(shuō)可以是自由命名的,但每個(gè)頭文件的這個(gè)“標(biāo)識(shí)”都應(yīng)該是唯一的。標(biāo)識(shí)的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h#ifndef _STDIO_H_#define _STDIO_H_.#endif2.在#ifndef中定義變量出現(xiàn)的問(wèn)題(一般不定義在#ifndef中)。#ifndef AAA#define AAA.int i;.#endif里面有一個(gè)變量定義在vc中鏈接時(shí)就出現(xiàn)了i重復(fù)定義的錯(cuò)誤,而在c中成功編譯。原因:(1).當(dāng)你第一個(gè)使用這個(gè)頭的.cpp文件生成.obj的時(shí)候,int i 在里面定義了當(dāng)另外一個(gè)使用這個(gè)的.cpp再次單獨(dú)生成.obj的時(shí)候,int i 又被定義然后兩個(gè)obj被另外一個(gè).cpp也include 這個(gè)頭的,連接在一起,就會(huì)出現(xiàn)重復(fù)定義。(2).把源程序文件擴(kuò)展名改成.c后,VC按照C語(yǔ)言的語(yǔ)法對(duì)源程序進(jìn)行編譯,而不是C+。在C語(yǔ)言中,若是遇到多個(gè)int i,則自動(dòng)認(rèn)為其中一個(gè)是定義,其他的是聲明。(3).C語(yǔ)言和C+語(yǔ)言連接結(jié)果不同,可能(猜測(cè))時(shí)在進(jìn)行編譯的時(shí)候,C+語(yǔ)言將全局變量默認(rèn)為強(qiáng)符號(hào),所以連接出錯(cuò)。C語(yǔ)言則依照是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 記賬實(shí)操-合同履約保證金協(xié)議模板
- 2025企業(yè)制造工人勞動(dòng)合同模板
- 2025園林綠化工程合同協(xié)議書(shū)模板
- 2025工程咨詢居間合同
- 2025教育機(jī)構(gòu)勞動(dòng)合同協(xié)議樣本
- 2025最正規(guī)的合同范本:保證合同示例
- 2025企業(yè)銷售代表勞動(dòng)合同
- 2025木材購(gòu)銷合同協(xié)議范本
- 8.1薪火相傳的傳統(tǒng)美德同步課件 2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 《術(shù)后常見(jiàn)并發(fā)癥解析》課件
- 無(wú)人機(jī)法律法規(guī)知識(shí)考核試題及答案
- 2024年廣東省梅州市中考一模歷史試題(無(wú)答案)
- 2024年北京鐵路局集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 前列腺癌2024治療指南
- (正式版)YST 1682-2024 鎂冶煉行業(yè)綠色工廠評(píng)價(jià)要求
- 2024-2029年中國(guó)形象設(shè)計(jì)行業(yè)發(fā)展分析及發(fā)展前景與投資研究報(bào)告
- 2024中國(guó)綠色甲醇產(chǎn)業(yè)研究與前景展望-云道資本
- 1500萬(wàn)噸-年煉化一體化項(xiàng)目環(huán)評(píng)
- 500字作文標(biāo)準(zhǔn)稿紙A4打印模板-直接打印
- 兒童康復(fù)家庭指導(dǎo)培訓(xùn)課件
- 單元2-任務(wù)3 水利工程年運(yùn)行費(fèi)及年費(fèi)用計(jì)算
評(píng)論
0/150
提交評(píng)論