C語言9編譯預(yù)處理_第1頁
C語言9編譯預(yù)處理_第2頁
C語言9編譯預(yù)處理_第3頁
C語言9編譯預(yù)處理_第4頁
C語言9編譯預(yù)處理_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

9第九章編譯預(yù)處理

2/4/20231◆宏定義

◆文件包含◆條件編譯

【編譯】C編譯系統(tǒng)對源程序進(jìn)行:詞法和語法分析,代碼生成,優(yōu)化→

.OBJ文件【編譯預(yù)處理】編譯前對源程序進(jìn)行一些預(yù)加工(改善程序設(shè)計(jì)環(huán)境/模塊化設(shè)計(jì))編譯預(yù)處理命令均以#開頭,未尾不加分號可出現(xiàn)在程序的任何位置,其作用范圍:出現(xiàn)點(diǎn)至所在源程序未尾。編譯預(yù)處理2/4/20232重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系

預(yù)處理功能

C語言的預(yù)處理程序負(fù)責(zé)分析和處理以“#”為首字符的預(yù)處理控制行。預(yù)處理是在編譯前進(jìn)行的。預(yù)處理控制行主要有:宏替換、文件包含、條件編譯和行控制等。宏替換

define預(yù)處理命令不僅可以定義符號常量及字符串,而且也可以定義帶參數(shù)的宏。1.簡單的字符串替換一般形式

#define宏標(biāo)識符字符串通?!昂陿?biāo)識符”用大寫字母表示,用空格分開,末尾不帶“;”,以換行符結(jié)束。2/4/20233重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系例如:#defineN10#defineTRUE-1#defineFALSE0#defineON1#defineOFF0#defineYES1#defineNO0#definePI3.14159#defineE2.7183#defineBLACK0#defineBLUE1#defineBEGIN{#defineEND}2/4/20234重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系

使用宏替換可增加程序的可移植型。例如:在程序中定義顯示工作摸式為640*350,#defineXMAX639#defineYMAM349當(dāng)改為1024*1024時(shí),可定義如下:#defineXMAX1023#defineYMAX1023這就增加了圖形程序?qū)τ布h(huán)境的適應(yīng)性。2.帶參宏定義及宏調(diào)用

與函數(shù)可帶形式參數(shù)一樣,宏標(biāo)識符也可帶有參數(shù)。在程序中可用實(shí)參數(shù)替帶形式參數(shù),實(shí)現(xiàn)宏調(diào)用。2/4/20235重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系宏定義的一般格式:

#define宏標(biāo)識符(形參數(shù)表)表達(dá)式宏調(diào)用的一般形式:

宏標(biāo)識符(實(shí)參數(shù)表)例如:#defineMAX(a,b)(a>b)?a:bmain(){

intx,y;x=10;y=20;

printf(”Themaximumdatais:%d”,MAX(x,y));}替換過程:

printf(”Themaximumdatais:%d”,(x>y)?x:y);2/4/20236重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系1、宏定義格式

#define宏名宏體宏名和宏體均為字符串,前者必須符合標(biāo)識符命名規(guī)則。預(yù)處理時(shí)在程序中用宏體替換宏名。注意:可以用

#undef

宏名

終止該宏名的作用范圍。宏定義的撤消:#undef

宏標(biāo)識符2/4/20237重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系①定義符號常量【例一】#defineM3#defineN(M+1)#defineNNN*N/2main(){

clrscr();

printf("NN=%d,",NN);printf("5*NN=%d\n",5*NN);}結(jié)果:NN=8,5*NN=40【討論】

如果第二行改為:

#defineNM+1

結(jié)果:

NN=6,5*NN=182/4/20238重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系②帶參數(shù)的宏定義

格式

#define宏名(參數(shù)表)宏體【例二】#definePI3.14159#defines(r)PI*r*rmain(){floata=1,sum;sum=s(a);

printf("r=%.0f,s=%f\n",a,sum);}結(jié)果:r=1,s=3.1415902/4/20239重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系②帶參數(shù)的宏定義

【例三】#definePT5.5#defines(A)PT*A*Amain(){

inta=1,b=2;printf("%4.1f\n",s(a+b));}結(jié)果:9.5【討論】注意s(a+b)不是函數(shù),它不做任何計(jì)算(如果是函數(shù),則s(a+b)為s(3),結(jié)果49.5)

s(a+b)=5.5×1+2×1+2=9.5

2/4/202310重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系②帶參數(shù)的宏定義【例四】選擇正確答案#include"stdio.h"#defineSUM(y)1+ymain(){

intx=2;printf("%d\n",SUM(5)*x);}

A)10B)11C)12D)15結(jié)果:B2/4/202311重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系2、文件包含#include<>標(biāo)準(zhǔn)方式只按標(biāo)準(zhǔn)方式(系統(tǒng)存放C庫函數(shù)頭文件所在目錄)查找所要包含的文件

對TC,默認(rèn)只在\tc\include目錄下查找#include““

先在源文件所在目錄找指定頭文件,若無再按標(biāo)準(zhǔn)方式找(更保險(xiǎn))功能:把給定的包含文件的內(nèi)容嵌入到一個(gè)源程序文件中。

#include”文件名“或:#include<文件名>2/4/202312重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系#include”font.h”

A

font.h

B

A

B

file1.c

file1.c

包含文件示意圖

特別警示 文件包含不可以彼此互相包含,否則容易造成嵌套定義函數(shù),這是C語言不允許的。

2/4/202313重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系

包含文件的存放地點(diǎn),由文件路徑和文件名指定,并放入雙引號或尖括號中。

系統(tǒng)約定的查找順序是:雙引號:源文件所在的當(dāng)前文件目錄系統(tǒng)指定的標(biāo)準(zhǔn)目錄尖括號:直接查找指定的標(biāo)準(zhǔn)目錄

Forexample:用戶在當(dāng)前目錄中定義有“font.h”文件,在編譯程序的系統(tǒng)標(biāo)準(zhǔn)目錄中也定義有一個(gè)同名“font.h”文件。當(dāng)用戶需要使用自己定義的“font.h”文件時(shí):應(yīng)使用:#include”font.h”!若使用:#include<font.h>將嵌入系統(tǒng)標(biāo)準(zhǔn)目錄中的“font.h”,而不是用戶自定義的頭文件。2/4/202314重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系3、條件編譯根據(jù)條件決定是否編譯某一組語句。常用形式:①如果標(biāo)識符被定義過*

如果標(biāo)識符未被定義過

#ifdef

標(biāo)識符#ifndef

標(biāo)識符程序段1程序段1/*編譯此程序段*/#else#else

/*#else部分可省略*/

程序段2程序段2/*反之,編譯此程序段*/#endif

#endif

*此處指標(biāo)識符用#define等命令定義過。2/4/202315重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系②#if表達(dá)式/*如果表達(dá)式為真*/

程序段1/*編譯程序段1*/#else

程序段2/否則*編譯程序段2*/#endif如果用:

if表達(dá)式程序段1else

程序段2亦可實(shí)現(xiàn)以上功能,但程序段1,2均要編譯。如果它們比較大,生成的exe文件就很大。3、條件編譯2/4/202316重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系3、條件編譯【例一】#defineDEBUG0main(){

inta=10,b=20,c;

clrscr();c=a/b;#ifdefDEBUG

printf("a=%d,b=%d\n",a,b);#endif

printf("c=%d\n",c);}結(jié)果:a=10,b=20c=0【討論】

如果#defineDEBUG呢?結(jié)果不變

如果沒有#define行呢?

只輸出c=0

2/4/202317重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系6、以下程序運(yùn)行結(jié)果是

。#defineSQR(x)x*xmain(){

inta=10,k=2,m=1;a/=SQR(k+m);

printf("%d\n",a);}23、條件編譯2/4/202318重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系③

#ifndef

條件編譯一般形式:#ifndef

標(biāo)識符 /*如果表達(dá)式為真*/ 程序段1 /*編譯程序段1*/#else

程序段2 /否則*編譯程序段2*/#endif作用是,如果標(biāo)識符未被定義,則編譯程序段1,否則編譯程序段2。例如:3條件編譯2/4/202319重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系

#defineUSA1main(){#ifdefUSA

printf(”currencyisdollar\n”);#else

printf(”currencyispound\n”);#ifndefFRANCE

printf(”franccan’tbeused\n”);#endif}運(yùn)行結(jié)果:currencyisdollarfranccan’tbeused2/4/202320重慶工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院基礎(chǔ)系

1.C語言的預(yù)處理功能是由預(yù)處理程序?qū)崿F(xiàn)的。預(yù)處理命令行都要以“#”開始,可以出現(xiàn)在源程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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

提交評論