




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十章編譯預(yù)處理華僑大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院劉韶濤副教授
第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.1
C預(yù)處理程序按照ANSI標(biāo)準(zhǔn)的定義,C預(yù)處理程序應(yīng)處理如下指令:#if#ifdef
#ifndef
#else#elif
#define#undef
10.1
C預(yù)處理程序#line#error#pragma顯然,所有的預(yù)處理指令都以#開始。而且,每條預(yù)處理指令必須獨(dú)占一行。例如:#include<stdio.h>#include<stdlib.h>是錯(cuò)誤的。本章我們只介紹一些最常用的指令,其它指令的使用,請(qǐng)大家需要時(shí)參考有關(guān)書籍。
10.1
C預(yù)處理程序第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.2#define#define指令定義一個(gè)標(biāo)記符和一個(gè)串,在源程序中發(fā)現(xiàn)該標(biāo)記符時(shí),都用該串替換之。ANSI標(biāo)準(zhǔn)中稱這種標(biāo)記符為宏名字(macroname),稱相應(yīng)的替換為宏替換(macrosubstitution)。這種指令的一般形式為:
#define宏名串這種語(yǔ)句不用分號(hào)結(jié)尾。宏名字與串之間可以有多個(gè)空白符,但串開始后只能以新行符(newline結(jié)尾)。比如:#defineTRUE1#defineFALSE0printf(“%d%d%d\n”,FALSE,TRUE,TRUE+1);/*顯示012*/
10.2
#define說(shuō)明:(1)宏定義之后,編譯程序?qū)⒊绦蛑械腡RUE和FALSE都替換為1和0。所以顯示結(jié)果為012。(2)定義一個(gè)宏名字之后,可以在其他宏定義中使用它。如:#defineONE1#defineTWOONE+1#defineTHREEONE+TWO
10.2
#define例10-1
宏定義及其使用#defineMESSAGE“Youareright!\n”#defineLONG_STRING“Thisisaverylongstring\thatisusedasaexample\n”#defineABS(a)(a)<0?-(a):(a)voidmain(void){
printf(MESSAGE);/*輸出:Youareright!*/
printf(“MESSAGE\n”);/*輸出:MESSAGE*/
printf(LONG_STRING);/*輸出:Thisisaverylongstring thatisusedasanexample*/
printf(“absof-1and1:%d%d\n”,ABS(-1),ABS(1));}
10.2
#define程序運(yùn)行情況如下:Youareright!MESSAGEThisisaverylongstringthatisusedasanexampleabsof-1and1:11
10.2
#define說(shuō)明:(1)遇到標(biāo)識(shí)符MESSAGE時(shí),編譯程序用串”Youareright!\n”替換之,等價(jià)于printf(“Youareright!\n”);(2)如果標(biāo)記符用引號(hào)(”)括起來(lái),則不發(fā)生替換。(3)如果串長(zhǎng)于一行,可在行尾用反斜線”\”進(jìn)行續(xù)行。
10.2
#define(4)#define指令還有一個(gè)重要功能:宏名字可以有變?cè)?。每?dāng)遇到宏名字時(shí),與之有關(guān)的變?cè)加沙绦蛑械膶?shí)際變?cè)鎿Q。如上例中的#defineABS(a)(a)<0?-(a):(a)。但要注意,#defineABS(a)(a)<0?-(a):(a)中變?cè)猘兩邊的括號(hào)是不能少的,否則,會(huì)產(chǎn)生非預(yù)期結(jié)果。如:#defineABS(a)a<0?-a:aprintf(”absof(10-20):%d\n”,ABS(10-20));ABS(10-20)替換為:10-20<0?-10-20:10-20,則輸出結(jié)果為-30。
10.2
#define第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.3#include程序中的#include指令要求編譯程序讀入另一個(gè)源文件。被讀入文件的名字必須由雙引號(hào)(”)或一對(duì)尖括號(hào)(<>)包圍。如:#include”stdio.h”或#include<stdio.h>都令編譯程序讀入并編譯用于I/O函數(shù)處理的包含文件stdio.h。
10.3
#include說(shuō)明:(1)包含文件中還可以包含其它文件,稱為嵌套包含(nestedincludes)。允許的最大嵌套深度隨編譯程序而變。(2)用尖括號(hào)包圍頭文件時(shí),搜索頭文件時(shí)按編譯程序的預(yù)先定義進(jìn)行,一般只搜索某些專門放置包含頭文件的特殊目錄。當(dāng)頭文件用雙引號(hào)包圍時(shí),搜索按編譯程序?qū)崿F(xiàn)時(shí)的規(guī)定進(jìn)行,一般指搜索當(dāng)前目錄,如未發(fā)現(xiàn)頭文件,則再按尖括號(hào)包圍時(shí)的辦法重新搜索。
10.3
#include第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.4條件編譯指令若干編譯指令允許程序員有選擇地編譯程序的不同部分,這種過(guò)程稱為條件編譯(conditionalcompilation),廣泛用于提供多版本程序的軟件生產(chǎn)者。#if、#else、#elif和#endif#if的一般形式為:#if常量表達(dá)式代碼塊
#endif#if后的常量表達(dá)式為真時(shí),#if和#endif之間的代碼塊被編譯,否則忽略該代碼塊。#endif標(biāo)記#if塊的結(jié)束。10.4條件編譯指令例10-2
編譯指令#if的使用#include<stdio.h>#defineMAX100voidmain(void){#ifMAX>90
printf(“Examplefor#if\n”);#endif}程序運(yùn)行情況如下:Examplefor#if10.4條件編譯指令說(shuō)明:(1)因?yàn)槌A勘磉_(dá)式為真,所以printf()被編譯。(2)#if后面的表達(dá)式在編譯時(shí)求值,因此只能包括常數(shù)和已經(jīng)定義的宏名字,不能使用變量。(3)#else指令的作用于C語(yǔ)言條件分支語(yǔ)句中的else類似,建立#if失敗時(shí)的備選。如上例可以擴(kuò)充如下:10.4條件編譯指令#include<stdio.h>#defineMAX10voidmain(void){#ifMAX>90
printf(“Examplefor#if\n”);#else
printf(“Examplefor#else\n”);/*顯示該信息*/#endif}10.4條件編譯指令說(shuō)明:(1)#if后的常量表達(dá)式為假,所以#else后的代碼塊被編譯。(2)#else既標(biāo)記#if塊的結(jié)束,也標(biāo)記#else塊的開始,每個(gè)#if只能與一個(gè)#endif匹配。#elif指令的一般形式為:
#if表達(dá)式代碼塊
#elif
表達(dá)式1
代碼塊1#elif
表達(dá)式2
代碼塊2…#elif
表達(dá)式N
代碼塊N#endif10.4條件編譯指令(3)#elif指令的含義是“否則,如果”,它為多重選擇建立一條if-else-if鏈。如果#if表達(dá)式為真,該代碼塊被編譯,此時(shí)就不再測(cè)試其它#elif表達(dá)式,否則,序列中的下一塊被測(cè)試,如成功則編譯之。如:#defineUS0#defineENGLAND1#defiineRRANCE2#defineACTIVE_COUNTRYUS#ifACTIVE_COUNTRY==UScharcurrency[]=”dollar”;/*被編譯*/#elifACTIVE_COUNTRY==ENGLANDcharcurrency[]=”pound”;#elsecharcurrency[]=”franc”;#endif10.4條件編譯指令(4)#if和#elif也可以嵌套,最大嵌套深度隨編譯程序而變。與C語(yǔ)言中條件分支語(yǔ)句if-else嵌套中的else與if的對(duì)應(yīng)關(guān)系類似,要注意嵌套鏈中#if與#endif、#if與#else、#if與#elif的對(duì)應(yīng)關(guān)系。10.4條件編譯指令#ifdef和#ifndef條件編譯的另一個(gè)方法是使用編譯指令#ifdef和#ifndef,分別表示“如果已定義”和“如果未定義”。#ifdef的一般形式為:
#ifdef
宏名字
代碼塊
#endif其含義為:如果前面已經(jīng)在一個(gè)#define指令中定義了宏名字,則編譯代碼塊。類似地,#dendef的一般形式為:10.4條件編譯指令
#ifndef
宏名字
代碼塊
#endif其含義為:如宏名字還未被一個(gè)#define指令定義,則編譯其中的代碼塊。注意:#ifdef和#ifndef都可以使用#else,但不能用#elif。10.4條件編譯指令例10-3
編譯指令#ifdef和#ifndef的使用#include”stdio.h”#defineTED10voidmain(void){#ifdefTED/*已定義宏TED*/
printf(“HiTed\n”);/*被編譯*/#else
printf(“Hianyone\n”);#endif#ifndefRALPH/*未曾定義宏RALPH*/
printf(“RALPHnotdefined\n”);/*被編譯*/#endif}10.4條件編譯指令程序運(yùn)行情況如下:HiTedRALPHnotdefined說(shuō)明:(1)因?yàn)橐呀?jīng)在#define編譯命令中定義了宏TED,所以語(yǔ)句printf(“HiTed\n”);被編譯,因?yàn)槲丛?define中定義宏RALPH,所以語(yǔ)句printf(“RALPHnotdefined\n”);*被編譯。(2)#ifdef和#ifndef的嵌套情況與#if相同。10.4條件編譯指令第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.5#undef#undef指令的一般形式為:
#undef
宏名字其作用是刪除前面定義的宏名字,主要用于使宏名字局部化,使其僅局部于需要這類宏名字的代碼段。10.5#undef例10-4
編譯指令#undef的使用#include"stdio.h"#defineNAME"TsinghuaUni.\n"/*定義了宏NAME*/voidmain(void){#ifdefNAME
printf(NAME);/*參加編譯*/#endif#undefNAME/*取消了宏NAME的定義*/#ifndefNAME/*沒有定義宏NA
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025廣州市購(gòu)銷合同范本(定版)
- 幼兒早期學(xué)習(xí)支持知到課后答案智慧樹章節(jié)測(cè)試答案2025年春山東省文登師范學(xué)校
- 2025合同法的新發(fā)展與實(shí)踐應(yīng)用
- 2025年家庭裝修工程合同范本
- 2025年設(shè)備的租賃合同范本
- 2024年鄭州市保安服務(wù)集團(tuán)有限公司招聘真題
- 總復(fù)習(xí) 數(shù)的運(yùn)算第4課時(shí) 教案2024-2025學(xué)年數(shù)學(xué)六年級(jí)下冊(cè)-北師大版
- 2024年邵陽(yáng)市民政局所屬事業(yè)單位招聘工作人員真題
- 2024年衢州市衢江區(qū)綜合事業(yè)單位招聘真題
- 2024年樂(lè)山市五通橋區(qū)人民醫(yī)院中醫(yī)醫(yī)院招聘真題
- 社會(huì)保障基金管理智慧樹知到答案章節(jié)測(cè)試2023年首都經(jīng)濟(jì)貿(mào)易大學(xué)
- 二級(jí)減速器攪拌機(jī)斜齒圓柱齒輪課程設(shè)計(jì)
- 一年級(jí)語(yǔ)文雨點(diǎn)兒-教學(xué)課件【希沃白板初階培訓(xùn)結(jié)營(yíng)大作業(yè)】
- 衛(wèi)生部手術(shù)分級(jí)目錄(2023年1月份修訂)
- GA/T 1323-2016基于熒光聚合物傳感技術(shù)的痕量炸藥探測(cè)儀通用技術(shù)要求
- 鋼棧橋施工監(jiān)理細(xì)則
- 優(yōu)秀員工榮譽(yù)證書模板
- 金蝶PLM詳細(xì)介紹
- 湖南文藝出版社小學(xué)六年級(jí)下冊(cè)音樂(lè)全冊(cè)教案
- 高中語(yǔ)文《祝?!贰罢l(shuí)是兇手”系列之祥林嫂死亡事件《祝?!诽骄渴綄W(xué)習(xí)(教學(xué)課件) 課件
- 中國(guó)十大階層的劃分課件
評(píng)論
0/150
提交評(píng)論