第10章 高級語言程序設(shè)計(jì)C-編譯預(yù)處理_第1頁
第10章 高級語言程序設(shè)計(jì)C-編譯預(yù)處理_第2頁
第10章 高級語言程序設(shè)計(jì)C-編譯預(yù)處理_第3頁
第10章 高級語言程序設(shè)計(jì)C-編譯預(yù)處理_第4頁
第10章 高級語言程序設(shè)計(jì)C-編譯預(yù)處理_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第十章編譯預(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ò)誤的。本章我們只介紹一些最常用的指令,其它指令的使用,請大家需要時(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宏名串這種語句不用分號結(jié)尾。宏名字與串之間可以有多個(gè)空白符,但串開始后只能以新行符(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)定義一個(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說明:(1)遇到標(biāo)識符MESSAGE時(shí),編譯程序用串”Youareright!\n”替換之,等價(jià)于printf(“Youareright!\n”);(2)如果標(biāo)記符用引號(”)括起來,則不發(fā)生替換。(3)如果串長于一行,可在行尾用反斜線”\”進(jìn)行續(xù)行。

10.2

#define(4)#define指令還有一個(gè)重要功能:宏名字可以有變元。每當(dāng)遇到宏名字時(shí),與之有關(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指令要求編譯程序讀入另一個(gè)源文件。被讀入文件的名字必須由雙引號(”)或一對尖括號(<>)包圍。如:#include”stdio.h”或#include<stdio.h>都令編譯程序讀入并編譯用于I/O函數(shù)處理的包含文件stdio.h。

10.3

#include說明:(1)包含文件中還可以包含其它文件,稱為嵌套包含(nestedincludes)。允許的最大嵌套深度隨編譯程序而變。(2)用尖括號包圍頭文件時(shí),搜索頭文件時(shí)按編譯程序的預(yù)先定義進(jìn)行,一般只搜索某些專門放置包含頭文件的特殊目錄。當(dāng)頭文件用雙引號包圍時(shí),搜索按編譯程序?qū)崿F(xiàn)時(shí)的規(guī)定進(jìn)行,一般指搜索當(dāng)前目錄,如未發(fā)現(xiàn)頭文件,則再按尖括號包圍時(shí)的辦法重新搜索。

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á)式為真時(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條件編譯指令說明:(1)因?yàn)槌A勘磉_(dá)式為真,所以printf()被編譯。(2)#if后面的表達(dá)式在編譯時(shí)求值,因此只能包括常數(shù)和已經(jīng)定義的宏名字,不能使用變量。(3)#else指令的作用于C語言條件分支語句中的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條件編譯指令說明:(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í)就不再測試其它#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條件編譯的另一個(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說明:(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論