第十一章編譯預處理_第1頁
第十一章編譯預處理_第2頁
第十一章編譯預處理_第3頁
第十一章編譯預處理_第4頁
第十一章編譯預處理_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、自控技術程序設計基礎系部:自動控制系姓名:陳洪圳河南機電高等??茖W校第第1111章章 編譯預處理編譯預處理11.1 11.1 宏定義宏定義11.2 11.2 文件包含文件包含11.3 11.3 條件編譯條件編譯河南機電高等??茖W校 ANSI C標準規(guī)定可以在C源程序中加入一些“預處理命令”,以改進程序設計環(huán)境,提高編程效率。 在對程序進行通常的編譯之前,先對程序中這些特殊的命令進行“預處理”,即根據預處理命令對程序作相應的處理。 經過預處理后的程序不再包括預處理命令了,最后再由編譯程序對預處理后的源程序進行通常的編譯處理,得到可執(zhí)行的目標代碼。 C提供的預處理功能主要有以下3種: 宏定義、文件

2、包含、條件編譯11.1宏定義 11.1.1 不帶參數的宏定義不帶參數的宏定義定義時的一般形式為:#define 標識符 字符串其中的“#”表示這是一條預處理命令?!癲efine”為宏定義命令,“標識符”為所定義的宏名,“字符串”可以是常數、表達式、格式串等。河南機電高等??茖W校例如前面介紹過的符號常量的定義就是一種無參宏定義。此外,經常對程序中需要反復使用的表達式進行宏定義。河南機電高等??茖W校#define M (y*y+2*y+1)void main()int s,y;printf(input a number: );scanf(%d,&y);s=3*M+4*M+5*M;print

3、f(s=%dn,s);河南機電高等??茖W校 對于宏定義還要說明以下幾點: (1) 宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現。 河南機電高等??茖W校(2) 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。 河南機電高等??茖W校(3) 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。 河南機電高等??茖W校(4) 宏名在源程序中若用引號括起來,則預處理程序不

4、對其作宏代換。 #define PI 3.14 main() printf(PI); printf(n); 河南機電高等??茖W校 (5) 宏定義允許嵌套,在宏定義的字符串中可以使用已經定義的宏名。在宏展開時由預處理程序逐層代換。 例如: #define PI 3.1415926 #define S PI*y*y /* PI是已定義的宏名*/ 則語句:printf(%f,S);在宏代換后應為:printf(%f,3.1415926*y*y); 河南機電高等專科學校(6) 習慣上宏名用大寫字母表示,以便于與變量區(qū)別。但也允許用小寫字母。(7)可用宏定義表示數據類型,使書寫方便。(8)對“輸出格式”

5、作宏定義,可以減少書寫麻煩。河南機電高等專科學?!纠?1.1】對“輸出格式”作宏定義。#define P printf#define D %dn#define F %fnmain() int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); 河南機電高等??茖W校 11.1.2 11.1.2 帶參數的宏定義帶參數的宏定義 語言允許宏帶有參數。 在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。 河南機電高等專科學校

6、帶參數宏定義的一般形式為: #define 宏名(形參表)帶參數宏調用的一般形式為: 宏名(實參表); 河南機電高等專科學校例如: #define M(y) y*y+3*y /*宏定義*/ k=M(5); /*宏調用*/ 在上述語句中,在宏調用時用實參5去代替形參y,經預處理宏展開后的語句為:k=5*5+3*5。河南機電高等??茖W?!纠?1.2】帶參宏定義使用舉例。#define MAX(a,b) (ab)?a:bmain() int x,y,max; printf(input two numbers: ); scanf(%d%d,&x,&y); max=MAX(x,y); p

7、rintf(max=%dn,max);河南機電高等??茖W校【例11.3】 表達式作為宏調用中的實參。#define SQ(y) (y)*(y)main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=%dn,sq); 運行結果為:input a number:3sq=16 河南機電高等??茖W校#define SQ(y) y*ymain()int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=

8、%dn,sq);運行結果為:input a number:3sq=7 河南機電高等專科學校#define SQ(y) (y)*(y)main()int a,sq;printf(input a number: );scanf(%d,&a);sq=160/SQ(a+1);printf(sq=%dn,sq);運行結果為:input a number:3sq=160 河南機電高等專科學校#define SQ(y) (y)*(y)main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=160/SQ(a+1); printf(

9、sq=%dn,sq); 運行結果為:input a number:3sq=10 河南機電高等??茖W校11.2 11.2 文件包含文件包含文件包含是C預處理程序的另一個重要功能。文件包含命令行的一般形式為: #include文件名 在前面我們已多次用此命令包含過庫函數的頭文件。例如: #includestdio.h#includemath.h 河南機電高等??茖W校對文件包含命令還要說明以下幾點:1. 包含命令中的文件名可以用雙引號括起來,也可以用尖括號括起來。例如以下寫法都是允許的: #includestdio.h#include河南機電高等??茖W校 但是這兩種形式是有區(qū)別的:使用尖括號表示在包

10、含文件目錄中去查找(包含目錄是由用戶在設置環(huán)境時設置的), 而不在源文件目錄去查找; 使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找。 用戶編程時可根據自己文件所在的目錄來選擇某一種命令形式。河南機電高等專科學校2. 一個include命令只能指定一個被包含文件, 若有多個文件要包含,則需用多個include命令。3. 文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。河南機電高等專科學校11.3 11.3 條件編譯條件編譯條件編譯主要有下面三種形式:(1)第一種形式 #ifdef 標識符 程序段1 #else 程序段2 #endif 河南機電高等??茖W

11、校 它的功能是,如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),則本格式中的#else可以沒有, 即可以寫為: #ifdef 標識符 程序段 #endif 河南機電高等專科學校【例11.5】條件編譯示例一。#define NUM okvoid main()struct stuint num;char *name;char sex;float score; *ps;ps=(struct stu*)malloc(sizeof(struct stu);ps-num=102;ps-name=Zhang ping;ps-sex=M;ps-

12、score=62.5;河南機電高等專科學校#ifdef NUMprintf(Number=%dnScore=%fn,ps-num,ps-score);#elseprintf(Name=%snSex=%cn,ps-name,ps-sex);#endiffree(ps); 河南機電高等??茖W校(2)第二種形式 #ifndef 標識符 程序段1 #else 程序段2 #endif 與第一種形式的區(qū)別是將“ifdef”改為“ifndef”。它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯, 否則對程序段2進行編譯。這與第一種形式的功能正相反。 河南機電高等專科學校(3)第三種形式 #if 常量表達式 程序段1 #else 程序段2 #endif 它的功能是,如常量表達式的值為真(非0),則對程序段1 進行編譯,否則對程序段2進行編譯。從而可以使程序在不同條件下完成不同的功能。河南機電高等??茖W校【例1

溫馨提示

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

評論

0/150

提交評論