C語言實(shí)用教程(第4版)教案 21 5.7 編譯預(yù)處理_第1頁
C語言實(shí)用教程(第4版)教案 21 5.7 編譯預(yù)處理_第2頁
C語言實(shí)用教程(第4版)教案 21 5.7 編譯預(yù)處理_第3頁
C語言實(shí)用教程(第4版)教案 21 5.7 編譯預(yù)處理_第4頁
C語言實(shí)用教程(第4版)教案 21 5.7 編譯預(yù)處理_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

沈陽職業(yè)技術(shù)學(xué)院教案用紙第8周總第21次學(xué)時:2教學(xué)班級:軟件專業(yè)各班課程:C語言程序設(shè)計授課教師:劉暢課題:5.7編譯預(yù)處理教學(xué)方法:啟發(fā)式、案例式教具:常規(guī)教具教學(xué)目標(biāo):使同學(xué)們掌握宏定義、文件包含及條件編譯的格式及使用方法教學(xué)重點(diǎn):文件包含及條件編譯的使用教學(xué)難點(diǎn):預(yù)定義文件與主函數(shù)不在同一個文件里如何運(yùn)行主要教學(xué)內(nèi)容:5.7編譯預(yù)處理5.7.1宏定義5.7.2文件包含5.7.3條件編譯課后回顧:沈陽職業(yè)技術(shù)學(xué)院教案用紙四個一:提問:全局變量與局部變量的區(qū)別導(dǎo)入:C程序的編譯可分成編譯預(yù)處理和正式編譯兩個步驟。在編譯C源程序時,系統(tǒng)將自動調(diào)用編譯預(yù)處理程序,根據(jù)編譯預(yù)處理命令對程序進(jìn)行適當(dāng)?shù)募庸?,處理完畢自動進(jìn)入對源程序的正式編譯。正文:5.7編譯預(yù)處理C程序的編譯可分成編譯預(yù)處理和正式編譯兩個步驟。在編譯C源程序時,系統(tǒng)將自動調(diào)用編譯預(yù)處理程序,根據(jù)編譯預(yù)處理命令對程序進(jìn)行適當(dāng)?shù)募庸?,處理完畢自動進(jìn)入對源程序的正式編譯。預(yù)處理是C語言的一個重要功能,它由預(yù)處理程序負(fù)責(zé)完成。C語言提供了多種預(yù)處理功能,如宏定義、文件包含和條件編譯等。預(yù)處理有以下幾個特點(diǎn)。(1)預(yù)處理命令均以#開頭,結(jié)尾不加分號。(2)預(yù)處理命令可以放在程序中任何位置,作用范圍從定義到文件結(jié)尾。5.7.1宏定義宏定義是用一個標(biāo)識符(又稱宏名)定義為一個字符串(又稱宏體)。在編譯預(yù)處理時,對程序中所有在宏定義中定義的標(biāo)識符,都用宏定義中的相應(yīng)字符串替換,稱為“宏替換”或“宏展開”。C語言的宏定義分為兩種:一種是簡單宏定義,即不帶參數(shù)的宏定義;另一種是復(fù)雜的宏定義,即帶參數(shù)的宏定義(有參宏定義)。1.不帶參數(shù)的宏定義不帶參數(shù)宏定義的一般形式如下:#define#define標(biāo)識符字符串其中,#define是宏定義的命令,標(biāo)識符和字符串之間用空格分開。標(biāo)識符稱為“宏名”,字符串又稱為宏體。功能:在程序中凡出現(xiàn)該標(biāo)識符(宏名)的位置,經(jīng)編譯預(yù)處理的加工,都被替換成對應(yīng)的宏體字符串,稱之為“宏展開”。例如:#definePI3.1415926/*定義PI為一個宏,其值為3.1415926*/關(guān)于宏的幾點(diǎn)說明如下。(1)使用宏名代替一個字符串,可以減少程序中重復(fù)書寫某些字符串的工作量,增加程序的可讀性,而且不易出錯。(2)宏定義命令行放在源程序的函數(shù)外時,宏名的作用域從宏定義命令行開始到本源文件結(jié)束。(3)宏名的作用域可以使用#undef命令終止,形式如下:#undef#undef標(biāo)識符在#define語句定義了該宏之后,到#undef命令之前的程序中,該宏定義都有效,但在#undef命令后該宏則無效了。(4)C語言中,用宏名替換一個字符串是簡單的轉(zhuǎn)換過程,不作語法檢查。若將宏體的字符串中符號寫錯了,宏展開時照樣代入,只有在編譯宏展開后的源程序時才會提示語法錯誤。例如:#definePI3.141592B/*定義PI為一個宏,其值為3.141592B,值出錯*/預(yù)處理時照樣替換,而不管其含義是否正確,一直到對宏展開的結(jié)果進(jìn)行編譯時,才會產(chǎn)生錯誤提示。(5)一個宏名只能被定義一次,否則會出現(xiàn)重復(fù)定義的錯誤。(6)宏定義可以嵌套。在宏體中,可以出現(xiàn)已定義的宏名,例如:#definePI3.1415926#definePIR(PI*r) /*PI為已定義的宏名*/(7)如果宏定義一行書寫不下,可用反斜線“\”和回車鍵來結(jié)束本行,然后在下一行繼續(xù)書寫。例如,有如下程序:#defineSTR"Hello,\alltheworldpeople!"main(){printf("%s\n",STR);}運(yùn)行程序?qū)⑤敵觯篐ello,alltheworldpeople!(8)程序中出現(xiàn)的由雙引號括起來的字符串,即使和宏名相同,也不進(jìn)行宏替換。例如,在輸出函數(shù)printf()中如果在雙引號內(nèi)有與宏名相同的字符串,也不認(rèn)為是宏,只認(rèn)為是普通字符串原樣輸出。2.帶參數(shù)的宏定義帶參數(shù)宏定義的一般格式如下:#define#define標(biāo)識符(形參表)形參表達(dá)式其中,#define是宏定義的命令,標(biāo)識符后的圓括號內(nèi)為形參表,后面形參表達(dá)式為圓括號內(nèi)的各形參構(gòu)成的表達(dá)式。例如:#defineMAX(a,b)(a>b)?(a):(b)/*定義了一個帶參數(shù)的宏MAX,有兩個參數(shù)a、b,其功能是求a和b中較大值*/帶參數(shù)的宏的調(diào)用格式如下:標(biāo)識符(實(shí)參表)標(biāo)識符(實(shí)參表)進(jìn)行宏替換時,可以像使用函數(shù)一樣,通過實(shí)參與形參傳遞數(shù)據(jù)。帶參數(shù)的宏展開是用宏調(diào)用提供的實(shí)參字符串,直接置換宏定義命令行中相應(yīng)形參字符串,非形參字符保持不變。帶參數(shù)的宏展開時要注意以下兩點(diǎn)。(1)帶參數(shù)的宏展開是按#define命令行中指定的字符串從左到右進(jìn)行置換。(2)如果宏體字符串中包含宏名中的形參,則將程序語句中相應(yīng)的實(shí)參代替形參,如果字符串中的字符不是參數(shù)字符,則保留。例如,在主函數(shù)中有如下語句:intx=3,y=5,m;m=MAX(x*2,y*3);/*使用帶參數(shù)的宏,可以進(jìn)行宏替換*/則替換后相當(dāng)于:m=(x*2>y*3)?(x*2):(y*3);/*替換時將x*2替換形參表達(dá)式中的a,將y*3替換b*/帶參數(shù)的宏定義的幾點(diǎn)說明如下。(1)定義有參數(shù)的宏時,宏名應(yīng)當(dāng)與參數(shù)表的左括號緊緊相連。否則,C編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,而將該宏視為無參宏。(2)宏定義時,應(yīng)將整個字符串以及其中的各個參數(shù)均用圓括號括起來,以確保宏展開后字符串中各個參數(shù)的計算順序的正確性,避免出現(xiàn)錯誤。例如,宏定義為:#defineS(a,b)a*b在程序中遇到如下語句:m=S(a+1,b+1)*c;對其進(jìn)行宏展開如下:m=a+1*b+1*c;此時表達(dá)式變?yōu)閍+b+c,這與想要的((a+1)*(b+1))*c不同,所以出錯。可將每個參數(shù)和整個字符串都用括號括起來,改為以下宏定義:#defineS(a,b)((a)*(b))再對以上語句進(jìn)行宏展開,結(jié)果如下:m=((a+1)*(b+1))*c;這正是想要的結(jié)果。(3)在宏定義中的形參是標(biāo)識符,而宏展開的實(shí)參可以是表達(dá)式。例如上面的語句:m=S(a+1,b+1)*c;在宏調(diào)用的語句S(a+1,b+1)中表達(dá)式a+1和b+1為S的兩個實(shí)參。5.7.2文件包含一個大程序,通常分為多個模塊,并由多個程序員分別編程。有了文件包含處理功能,就可以將多個模塊共用的數(shù)據(jù)(如符號常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個單獨(dú)的文件中。這樣,凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進(jìn)來即可,不必再重復(fù)定義它們,從而減少重復(fù)勞動。1.文件包含命令的兩種格式文件包含功能是把指定的一個源文件的全部內(nèi)容插入到源程序該命令行。文件包含命令格式主要有以下兩種。(1)只檢索C語言編譯系統(tǒng)所確定的標(biāo)準(zhǔn)目錄,格式如下:#include#include<文件名>(2)首先對使用包含文件的源文件所在的目錄進(jìn)行檢索,若沒有找到指定的文件,再在標(biāo)準(zhǔn)目錄中檢索,格式如下:#include#include"文件名"2.文件包含命令幾點(diǎn)說明(1)編譯預(yù)處理時,預(yù)處理程序?qū)⒉檎抑付ǖ谋话募?,并將其?fù)制到#include命令出現(xiàn)的位置上。(2)常用在文件頭部的被包含文件,稱為“標(biāo)題文件”或“頭部文件”,常以“h”(head)作為后綴,簡稱頭文件。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類型定義等。(3)(4)文件包含可以嵌套,即被包含文件中又包含另一個文件。5.7.3條件編譯所謂條件編譯,是指對源程序進(jìn)行選擇性編譯。通常情況下,C語言程序的所有程序行都需要進(jìn)行編譯,但有時可能希望程序的某個程序段在滿足一定條件時才決定進(jìn)行編譯或不進(jìn)行編譯。使用條件編譯功能,為程序的調(diào)試和移植提供了有力的機(jī)制,使程序可以適應(yīng)不同系統(tǒng)和硬件設(shè)置的通用性和靈活性。常用條件編譯有以下兩種形式,下面分別介紹。1.#ifdef命令(或#ifndef命令)#ifdef(或#ifndef)命令的一般格式如下##ifdef標(biāo)識符 #ifndef標(biāo)識符程序段1 程序段1[#else或 [#else程序段2] 程序段2]#endif #endif功能:#ifdef命令的功能是如果“標(biāo)識符”已經(jīng)被#define命令定義過,則編譯程序段1,否則編譯程序段2。#ifndef命令格式與#ifdef命令一樣,功能與#ifdef命令相反。如果“標(biāo)識符”未被#define命令定義過,則編譯程序段1,否則編譯程序段2。2.#if命令#if命令一般格式如下:##if常量表達(dá)式程序段1 [#else程序段2]#endif 功能:#if命令的功能是當(dāng)表達(dá)式為非0(“邏輯真”)時,編譯程序段1,否則編譯程序段2。3.條件編譯和if語句的區(qū)別。(1)if語句控制某些語句是否被執(zhí)行,#if命令控制著某個程序段是否被編譯。(2)用if語句調(diào)試程序成功后,其調(diào)試語句仍被編譯成目標(biāo)代碼,只是不再執(zhí)行,成為廢碼。而使用條件編譯調(diào)試程序成功后,其調(diào)試語句不再被編譯,不生成目標(biāo)代碼,沒有廢碼產(chǎn)生,空間利用率較高。小結(jié):C程序的編譯可分為編譯預(yù)處理和正式編譯兩個步驟。編譯預(yù)處理是在將源程序生成目

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論