C語言9編譯預處理_第1頁
C語言9編譯預處理_第2頁
C語言9編譯預處理_第3頁
C語言9編譯預處理_第4頁
C語言9編譯預處理_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

9第九章編譯預處理

2/4/20231◆宏定義

◆文件包含◆條件編譯

【編譯】C編譯系統對源程序進行:詞法和語法分析,代碼生成,優化→

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

預處理功能

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

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

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

使用宏替換可增加程序的可移植型。例如:在程序中定義顯示工作摸式為640*350,#defineXMAX639#defineYMAM349當改為1024*1024時,可定義如下:#defineXMAX1023#defineYMAX1023這就增加了圖形程序對硬件環境的適應性。2.帶參宏定義及宏調用

與函數可帶形式參數一樣,宏標識符也可帶有參數。在程序中可用實參數替帶形式參數,實現宏調用。2/4/20235重慶工學院計算機科學與工程學院基礎系宏定義的一般格式:

#define宏標識符(形參數表)表達式宏調用的一般形式:

宏標識符(實參數表)例如:#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重慶工學院計算機科學與工程學院基礎系1、宏定義格式

#define宏名宏體宏名和宏體均為字符串,前者必須符合標識符命名規則。預處理時在程序中用宏體替換宏名。注意:可以用

#undef

宏名

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

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

clrscr();

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

如果第二行改為:

#defineNM+1

結果:

NN=6,5*NN=182/4/20238重慶工學院計算機科學與工程學院基礎系②帶參數的宏定義

格式

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

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

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

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

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

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

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

A)10B)11C)12D)15結果:B2/4/202311重慶工學院計算機科學與工程學院基礎系2、文件包含#include<>標準方式只按標準方式(系統存放C庫函數頭文件所在目錄)查找所要包含的文件

對TC,默認只在\tc\include目錄下查找#include““

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

#include”文件名“或:#include<文件名>2/4/202312重慶工學院計算機科學與工程學院基礎系#include”font.h”

A

font.h

B

A

B

file1.c

file1.c

包含文件示意圖

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

2/4/202313重慶工學院計算機科學與工程學院基礎系

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

系統約定的查找順序是:雙引號:源文件所在的當前文件目錄系統指定的標準目錄尖括號:直接查找指定的標準目錄

Forexample:用戶在當前目錄中定義有“font.h”文件,在編譯程序的系統標準目錄中也定義有一個同名“font.h”文件。當用戶需要使用自己定義的“font.h”文件時:應使用:#include”font.h”!若使用:#include<font.h>將嵌入系統標準目錄中的“font.h”,而不是用戶自定義的頭文件。2/4/202314重慶工學院計算機科學與工程學院基礎系3、條件編譯根據條件決定是否編譯某一組語句。常用形式:①如果標識符被定義過*

如果標識符未被定義過

#ifdef

標識符#ifndef

標識符程序段1程序段1/*編譯此程序段*/#else#else

/*#else部分可省略*/

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

#endif

*此處指標識符用#define等命令定義過。2/4/202315重慶工學院計算機科學與工程學院基礎系②#if表達式/*如果表達式為真*/

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

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

if表達式程序段1else

程序段2亦可實現以上功能,但程序段1,2均要編譯。如果它們比較大,生成的exe文件就很大。3、條件編譯2/4/202316重慶工學院計算機科學與工程學院基礎系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);}結果:a=10,b=20c=0【討論】

如果#defineDEBUG呢?結果不變

如果沒有#define行呢?

只輸出c=0

2/4/202317重慶工學院計算機科學與工程學院基礎系6、以下程序運行結果是

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

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

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

#ifndef

條件編譯一般形式:#ifndef

標識符 /*如果表達式為真*/ 程序段1 /*編譯程序段1*/#else

程序段2 /否則*編譯程序段2*/#endif作用是,如果標識符未被定義,則編譯程序段1,否則編譯程序段2。例如:3條件編譯2/4/202319重慶工學院計算機科學與工程學院基礎系

#defineUSA1main(){#ifdefUSA

printf(”currencyisdollar\n”);#else

printf(”currencyispound\n”);#ifndefFRANCE

printf(”franccan’tbeused\n”);#endif}運行結果:currencyisdollarfranccan’tbeused2/4/202320重慶工學院計算機科學與工程學院基礎系

1.C語言的預處理功能是由預處理程序實現的。預處理命令行都要以“#”開始,可以出現在源程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論