版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十章編譯預(yù)處理華僑大學(xué)計算機(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>是錯誤的。本章我們只介紹一些最常用的指令,其它指令的使用,請大家需要時參考有關(guān)書籍。
10.1
C預(yù)處理程序第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.2#define#define指令定義一個標(biāo)記符和一個串,在源程序中發(fā)現(xiàn)該標(biāo)記符時,都用該串替換之。ANSI標(biāo)準(zhǔn)中稱這種標(biāo)記符為宏名字(macroname),稱相應(yīng)的替換為宏替換(macrosubstitution)。這種指令的一般形式為:
#define宏名串這種語句不用分號結(jié)尾。宏名字與串之間可以有多個空白符,但串開始后只能以新行符(newline結(jié)尾)。比如:#defineTRUE1#defineFALSE0printf(“%d%d%d\n”,FALSE,TRUE,TRUE+1);/*顯示012*/
10.2
#define說明:(1)宏定義之后,編譯程序?qū)⒊绦蛑械腡RUE和FALSE都替換為1和0。所以顯示結(jié)果為012。(2)定義一個宏名字之后,可以在其他宏定義中使用它。如:#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說明:(1)遇到標(biāo)識符MESSAGE時,編譯程序用串”Youareright!\n”替換之,等價于printf(“Youareright!\n”);(2)如果標(biāo)記符用引號(”)括起來,則不發(fā)生替換。(3)如果串長于一行,可在行尾用反斜線”\”進(jìn)行續(xù)行。
10.2
#define(4)#define指令還有一個重要功能:宏名字可以有變元。每當(dāng)遇到宏名字時,與之有關(guān)的變元都由程序中的實(shí)際變元替換。如上例中的#defineABS(a)(a)<0?-(a):(a)。但要注意,#defineABS(a)(a)<0?-(a):(a)中變元a兩邊的括號是不能少的,否則,會產(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指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須由雙引號(”)或一對尖括號(<>)包圍。如:#include”stdio.h”或#include<stdio.h>都令編譯程序讀入并編譯用于I/O函數(shù)處理的包含文件stdio.h。
10.3
#include說明:(1)包含文件中還可以包含其它文件,稱為嵌套包含(nestedincludes)。允許的最大嵌套深度隨編譯程序而變。(2)用尖括號包圍頭文件時,搜索頭文件時按編譯程序的預(yù)先定義進(jìn)行,一般只搜索某些專門放置包含頭文件的特殊目錄。當(dāng)頭文件用雙引號包圍時,搜索按編譯程序?qū)崿F(xiàn)時的規(guī)定進(jìn)行,一般指搜索當(dāng)前目錄,如未發(fā)現(xiàn)頭文件,則再按尖括號包圍時的辦法重新搜索。
10.3
#include第十章編譯預(yù)處理內(nèi)容提要
C預(yù)處理程序#define
#include條件編譯指令#undef10.4條件編譯指令若干編譯指令允許程序員有選擇地編譯程序的不同部分,這種過程稱為條件編譯(conditionalcompilation),廣泛用于提供多版本程序的軟件生產(chǎn)者。#if、#else、#elif和#endif#if的一般形式為:#if常量表達(dá)式代碼塊
#endif#if后的常量表達(dá)式為真時,#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條件編譯指令說明:(1)因?yàn)槌A勘磉_(dá)式為真,所以printf()被編譯。(2)#if后面的表達(dá)式在編譯時求值,因此只能包括常數(shù)和已經(jīng)定義的宏名字,不能使用變量。(3)#else指令的作用于C語言條件分支語句中的else類似,建立#if失敗時的備選。如上例可以擴(kuò)充如下:10.4條件編譯指令#include<stdio.h>#defineMAX10voidmain(void){#ifMAX>90
printf(“Examplefor#if\n”);#else
printf(“Examplefor#else\n”);/*顯示該信息*/#endif}10.4條件編譯指令說明:(1)#if后的常量表達(dá)式為假,所以#else后的代碼塊被編譯。(2)#else既標(biāo)記#if塊的結(jié)束,也標(biāo)記#else塊的開始,每個#if只能與一個#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á)式為真,該代碼塊被編譯,此時就不再測試其它#elif表達(dá)式,否則,序列中的下一塊被測試,如成功則編譯之。如:#defineUS0#defineENGLAND1#defiineRRANCE2#defineACTIVE_COUNTRYUS#ifACTIVE_COUNTRY==UScharcurrency[]=”dollar”;/*被編譯*/#elifACTIVE_COUNTRY==ENGLANDcharcurrency[]=”pound”;#elsecharcurrency[]=”franc”;#endif10.4條件編譯指令(4)#if和#elif也可以嵌套,最大嵌套深度隨編譯程序而變。與C語言中條件分支語句if-else嵌套中的else與if的對應(yīng)關(guān)系類似,要注意嵌套鏈中#if與#endif、#if與#else、#if與#elif的對應(yīng)關(guān)系。10.4條件編譯指令#ifdef和#ifndef條件編譯的另一個方法是使用編譯指令#ifdef和#ifndef,分別表示“如果已定義”和“如果未定義”。#ifdef的一般形式為:
#ifdef
宏名字
代碼塊
#endif其含義為:如果前面已經(jīng)在一個#define指令中定義了宏名字,則編譯代碼塊。類似地,#dendef的一般形式為:10.4條件編譯指令
#ifndef
宏名字
代碼塊
#endif其含義為:如宏名字還未被一個#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說明:(1)因?yàn)橐呀?jīng)在#define編譯命令中定義了宏TED,所以語句printf(“HiTed\n”);被編譯,因?yàn)槲丛?define中定義宏RALPH,所以語句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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度駕校與保險公司合作的車險服務(wù)協(xié)議
- 二零二五年度音樂版權(quán)授權(quán)與詞曲制作合作合同
- 二零二五年度道路環(huán)境衛(wèi)生清掃與城市形象塑造合同
- 2025年度紅薯種植基地與農(nóng)產(chǎn)品電商平臺合作合同
- 二零二五年度跨省貨運(yùn)公司大車司機(jī)招聘協(xié)議
- 寶安區(qū)期末八上數(shù)學(xué)試卷
- 蚌埠四模數(shù)學(xué)試卷
- 建筑避震器施工方案
- 輕鋼龍骨石膏板吊頂施工方案
- 室外附屬工程施工方案
- 人教版小學(xué)英語各冊單詞表(帶英標(biāo))
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年六年級上學(xué)期期末考試數(shù)學(xué)試題
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 2024版義務(wù)教育小學(xué)數(shù)學(xué)課程標(biāo)準(zhǔn)
- 智能護(hù)理:人工智能助力的醫(yī)療創(chuàng)新
- 國家中小學(xué)智慧教育平臺培訓(xùn)專題講座
- 5G+教育5G技術(shù)在智慧校園教育專網(wǎng)系統(tǒng)的應(yīng)用
- VI設(shè)計輔助圖形設(shè)計
- 淺談小學(xué)勞動教育的開展與探究 論文
- 2023年全國4月高等教育自學(xué)考試管理學(xué)原理00054試題及答案新編
- 河北省大學(xué)生調(diào)研河北社會調(diào)查活動項(xiàng)目申請書
評論
0/150
提交評論