C語言電子教案第7章編譯預(yù)處理課件_第1頁
C語言電子教案第7章編譯預(yù)處理課件_第2頁
C語言電子教案第7章編譯預(yù)處理課件_第3頁
C語言電子教案第7章編譯預(yù)處理課件_第4頁
C語言電子教案第7章編譯預(yù)處理課件_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章編譯預(yù)處理學(xué)習(xí)目標(biāo)領(lǐng)會(huì)編譯預(yù)處理的作用和基本過程。會(huì)使用常用的編譯預(yù)處理命令。知道運(yùn)用編譯預(yù)處理命令時(shí)的常見錯(cuò)誤。第7章編譯預(yù)處理學(xué)習(xí)目標(biāo)1編譯預(yù)處理的概念7.1宏定義7.2文件包含7.3條件編譯什么是編譯預(yù)處理?預(yù)處理命令用在什么位置?什么是宏定義?什么是宏替換?宏定義時(shí)如何使用參數(shù)?什么文件包含?常用的頭文件有哪些?怎樣使用條件編譯命令?條件編譯命令有哪些格式?編譯預(yù)處理的概念什么是編譯預(yù)處理?預(yù)處理命令用在什么位置?什2所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。在源程序中,這些命令一般都放在源文件的前面,稱為預(yù)處理部分。

返回所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析37.1宏定義在C語言源程序中允許用一個(gè)標(biāo)識(shí)符來表示一個(gè)字符串,稱為“宏”。宏定義是由源程序中的宏定義命令完成的。宏替換是由預(yù)處理程序自動(dòng)完成的。7.1宏定義在C語言源程序中允許用一個(gè)標(biāo)識(shí)符來表示一個(gè)字47.1.1無參宏定義其定義的一般形式為:#define標(biāo)識(shí)符字符串例如:#defineW(x*x+x+1)如:#defineW(x*x+x+1)main(){intx,y;printf("inputanumber:");scanf("%d",&x);y=W*W+5*W;printf("y=%d\n",y);}7.1.1無參宏定義其定義的一般形式為:如:5宏定義說明:(1)宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,甚至可以是一個(gè)完整的語句。但應(yīng)注意的是,不能試圖將編譯預(yù)處理命令本身定義為宏。如:#defineDdefine#DPI3.1415926/*無法完成宏替換*/宏定義說明:(1)宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)6(2)預(yù)處理程序僅對(duì)程序中的宏作字符替換,而不作任何檢查。如有錯(cuò)誤,只能在編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。(3)宏定義不是說明或語句,因而在行末不必加分號(hào),如加上分號(hào)則在宏展開時(shí)連同分號(hào)一起替換。宏定義說明:(2)預(yù)處理程序僅對(duì)程序中的宏作字符替換,而不作任何檢查。如7(4)宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。如果需要終止其作用域可使用#undef命令。

例如:宏定義說明:#definePI3.14159main(){……}#undefPIf1(){}(4)宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序8(5)在函數(shù)體的字符串常量和定義過的變量名中若出現(xiàn)宏名,則編譯預(yù)處理程序不對(duì)其作宏替換。如:宏定義說明:#defineINTNUM32767#defines314main(){ints1=1;printf("INTNUM\n");printf("%d\n",s);printf("%d\n",s1);}運(yùn)行結(jié)果:INTNUM3141(5)在函數(shù)體的字符串常量和定義過的變量名中若出現(xiàn)宏名,則編9(6)宏定義允許嵌套,即:在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時(shí)由預(yù)處理程序?qū)訉犹鎿Q。例如:宏定義說明:#definePI3.1415926#defineSPI*r*r/*PI是已定義的宏名*/對(duì)語句:printf("%f",S);在宏替換后變?yōu)椋簆rintf("%f",3.1415926*r*r);(6)宏定義允許嵌套,即:在宏定義的字符串中可以使用已經(jīng)定義10(7)習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別。但在語法上允許用小寫字母。(8)可用宏定義表示數(shù)據(jù)類型,以便采用習(xí)慣或簡(jiǎn)便的寫法。例如:宏定義說明:#defineSTUstructstu在程序中可用STU作變量說明:STUstudent[5],*p;(7)習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別。但在語法上11(9)對(duì)“輸出格式”作宏定義,可以減少書寫麻煩。宏定義說明:#definePprintf#defineD"%d\n"#defineF"%f\n"main(){inta=3,b=6,c=9;floate=3.8,f=6.9,g=2.98;P(DF,a,e);P(DF,b,f);P(DF,c,g);}如:(9)對(duì)“輸出格式”作宏定義,可以減少書寫麻煩。宏定義說明:12帶參宏定義的一般形式為:#define宏名(形參表)字符串在字符串中含有形參表中列出的各個(gè)形參。帶參宏調(diào)用的一般形式為:宏名(實(shí)參表);7.1.2帶參宏定義例如:#defineN(y)y*y+y+1/*宏定義*/T=N(5);/*宏調(diào)用*/帶參宏定義的一般形式為:7.1.2帶參宏定義例如:#d13例7.1帶參宏替換。#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;printf("inputtwonumbers:");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}例7.1帶參宏替換。#defineMAX(a,b14帶參宏定義說明:

(1)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。例如:#defineMAX(a,b)(a>b)?a:b如果寫成:#defineMAX(a,b)(a>b)?a:b帶參宏定義說明:(1)帶參宏定義中,宏名和形參表之間不能有15(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因而不必作類型定義。而宏調(diào)用中的實(shí)參有具體的值。要用它們?nèi)ヌ鎿Q形參,因而必須作類型說明。這是與函數(shù)調(diào)用時(shí)情況有所不同。在函數(shù)調(diào)用過程中,形參和實(shí)參是兩個(gè)不同的量,有不同的作用域,調(diào)用時(shí)要把實(shí)參值賦予形參,進(jìn)行“值傳遞”。而在帶參宏中,只是符號(hào)替換,不存在值傳遞的問題。帶參宏定義說明:

(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因而不必作類型16(3)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。例:帶參宏定義說明:

#defineSQ(y)(y)*(y)main(){inta,sq;printf("inputanumber:");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);}(3)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式17(4)在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來以避免出錯(cuò)。(5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同,除上面已談到的各點(diǎn)外,把同一表達(dá)式用函數(shù)處理與用宏處理兩者的結(jié)果有可能是不同的。帶參宏定義說明:

(4)在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來以避免出錯(cuò)18(6)宏定義也可用來定義多個(gè)語句,在宏調(diào)用時(shí),把這些語句又替換到源程序內(nèi)。

帶參宏定義說明:

例如:#defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;SSSV(sa,sb,sc,vv);printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}返回(6)宏定義也可用來定義多個(gè)語句,在宏調(diào)用時(shí),把這些語句又替197.2文件包含文件包含命令行的一般形式為:#include"文件名“文件包含命令的功能是:把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個(gè)源文件。7.2文件包含文件包含命令行的一般形式為:20文件包含命令說明:(1)包含命令中的文件名可以用雙引號(hào)括起來,也可以用尖括號(hào)括起來。但是這兩種形式是有區(qū)別的。#include"stdio.h"#include<math.h>使用尖括號(hào)表示在包含文件目錄中去查找(包含目錄是由用戶在設(shè)置環(huán)境時(shí)設(shè)置的),而不在源文件目錄去查找;使用雙引號(hào)則表示首先在當(dāng)前的源文件目錄中查找,若未找到才到包含目錄中去查找。

文件包含命令說明:(1)包含命令中的文件名可以用雙引號(hào)括起來21文件包含命令說明:(2)一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。(3)文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含另一個(gè)文件。返回文件包含命令說明:(2)一個(gè)include命令只能指定一個(gè)227.3條件編譯1.第一種形式:功能:如果標(biāo)識(shí)符已被#define命令定義過,則對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。#ifdef標(biāo)識(shí)符程序段1#else程序段2#endif/*條件編譯舉例*/

7.3條件編譯1.第一種形式:#ifdef標(biāo)識(shí)符/*條232.第二種形式:功能:如果標(biāo)識(shí)符未被#define命令定義過則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。這與第一種形式的功能正相反。#ifndef標(biāo)識(shí)符程序段1#else程序段2#endif2.第二種形式:#ifndef標(biāo)識(shí)符243.第三種形式:功能:如常量表達(dá)式的值為真(非0),則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。#if常量表達(dá)式程序段1#else程序段2#endif舉例:3.第三種形式:#if常量表達(dá)式舉例:25第7章編譯預(yù)處理學(xué)習(xí)目標(biāo)領(lǐng)會(huì)編譯預(yù)處理的作用和基本過程。會(huì)使用常用的編譯預(yù)處理命令。知道運(yùn)用編譯預(yù)處理命令時(shí)的常見錯(cuò)誤。第7章編譯預(yù)處理學(xué)習(xí)目標(biāo)26編譯預(yù)處理的概念7.1宏定義7.2文件包含7.3條件編譯什么是編譯預(yù)處理?預(yù)處理命令用在什么位置?什么是宏定義?什么是宏替換?宏定義時(shí)如何使用參數(shù)?什么文件包含?常用的頭文件有哪些?怎樣使用條件編譯命令?條件編譯命令有哪些格式?編譯預(yù)處理的概念什么是編譯預(yù)處理?預(yù)處理命令用在什么位置?什27所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。在源程序中,這些命令一般都放在源文件的前面,稱為預(yù)處理部分。

返回所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析287.1宏定義在C語言源程序中允許用一個(gè)標(biāo)識(shí)符來表示一個(gè)字符串,稱為“宏”。宏定義是由源程序中的宏定義命令完成的。宏替換是由預(yù)處理程序自動(dòng)完成的。7.1宏定義在C語言源程序中允許用一個(gè)標(biāo)識(shí)符來表示一個(gè)字297.1.1無參宏定義其定義的一般形式為:#define標(biāo)識(shí)符字符串例如:#defineW(x*x+x+1)如:#defineW(x*x+x+1)main(){intx,y;printf("inputanumber:");scanf("%d",&x);y=W*W+5*W;printf("y=%d\n",y);}7.1.1無參宏定義其定義的一般形式為:如:30宏定義說明:(1)宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,甚至可以是一個(gè)完整的語句。但應(yīng)注意的是,不能試圖將編譯預(yù)處理命令本身定義為宏。如:#defineDdefine#DPI3.1415926/*無法完成宏替換*/宏定義說明:(1)宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)31(2)預(yù)處理程序僅對(duì)程序中的宏作字符替換,而不作任何檢查。如有錯(cuò)誤,只能在編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。(3)宏定義不是說明或語句,因而在行末不必加分號(hào),如加上分號(hào)則在宏展開時(shí)連同分號(hào)一起替換。宏定義說明:(2)預(yù)處理程序僅對(duì)程序中的宏作字符替換,而不作任何檢查。如32(4)宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。如果需要終止其作用域可使用#undef命令。

例如:宏定義說明:#definePI3.14159main(){……}#undefPIf1(){}(4)宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序33(5)在函數(shù)體的字符串常量和定義過的變量名中若出現(xiàn)宏名,則編譯預(yù)處理程序不對(duì)其作宏替換。如:宏定義說明:#defineINTNUM32767#defines314main(){ints1=1;printf("INTNUM\n");printf("%d\n",s);printf("%d\n",s1);}運(yùn)行結(jié)果:INTNUM3141(5)在函數(shù)體的字符串常量和定義過的變量名中若出現(xiàn)宏名,則編34(6)宏定義允許嵌套,即:在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時(shí)由預(yù)處理程序?qū)訉犹鎿Q。例如:宏定義說明:#definePI3.1415926#defineSPI*r*r/*PI是已定義的宏名*/對(duì)語句:printf("%f",S);在宏替換后變?yōu)椋簆rintf("%f",3.1415926*r*r);(6)宏定義允許嵌套,即:在宏定義的字符串中可以使用已經(jīng)定義35(7)習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別。但在語法上允許用小寫字母。(8)可用宏定義表示數(shù)據(jù)類型,以便采用習(xí)慣或簡(jiǎn)便的寫法。例如:宏定義說明:#defineSTUstructstu在程序中可用STU作變量說明:STUstudent[5],*p;(7)習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別。但在語法上36(9)對(duì)“輸出格式”作宏定義,可以減少書寫麻煩。宏定義說明:#definePprintf#defineD"%d\n"#defineF"%f\n"main(){inta=3,b=6,c=9;floate=3.8,f=6.9,g=2.98;P(DF,a,e);P(DF,b,f);P(DF,c,g);}如:(9)對(duì)“輸出格式”作宏定義,可以減少書寫麻煩。宏定義說明:37帶參宏定義的一般形式為:#define宏名(形參表)字符串在字符串中含有形參表中列出的各個(gè)形參。帶參宏調(diào)用的一般形式為:宏名(實(shí)參表);7.1.2帶參宏定義例如:#defineN(y)y*y+y+1/*宏定義*/T=N(5);/*宏調(diào)用*/帶參宏定義的一般形式為:7.1.2帶參宏定義例如:#d38例7.1帶參宏替換。#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;printf("inputtwonumbers:");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}例7.1帶參宏替換。#defineMAX(a,b39帶參宏定義說明:

(1)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。例如:#defineMAX(a,b)(a>b)?a:b如果寫成:#defineMAX(a,b)(a>b)?a:b帶參宏定義說明:(1)帶參宏定義中,宏名和形參表之間不能有40(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因而不必作類型定義。而宏調(diào)用中的實(shí)參有具體的值。要用它們?nèi)ヌ鎿Q形參,因而必須作類型說明。這是與函數(shù)調(diào)用時(shí)情況有所不同。在函數(shù)調(diào)用過程中,形參和實(shí)參是兩個(gè)不同的量,有不同的作用域,調(diào)用時(shí)要把實(shí)參值賦予形參,進(jìn)行“值傳遞”。而在帶參宏中,只是符號(hào)替換,不存在值傳遞的問題。帶參宏定義說明:

(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因而不必作類型41(3)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。例:帶參宏定義說明:

#defineSQ(y)(y)*(y)main(){inta,sq;printf("inputanumber:");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);}(3)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式42(4)在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來以避免出錯(cuò)。(5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同,除上面已談到的各點(diǎn)外,把同一表達(dá)式用函數(shù)處理與用宏處理兩者的結(jié)果有可能是不同的。帶參宏定義說明:

(4)在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來以避免出錯(cuò)43(6)宏定義也可用來定義多個(gè)語句,在宏調(diào)用時(shí),把這些語句又替換到源程序內(nèi)。

帶參宏定義說明:

例如:#defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;SSSV(sa,sb,sc,vv);printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}返回(6)宏定義也可用來定義多個(gè)語句,在宏調(diào)用時(shí),把這些語句又替447.2文件包含文件包含命令行的一般形式為:

溫馨提示

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

評(píng)論

0/150

提交評(píng)論