C基礎(chǔ)PPT課件第十一章 宏和預(yù)編譯_第1頁
C基礎(chǔ)PPT課件第十一章 宏和預(yù)編譯_第2頁
C基礎(chǔ)PPT課件第十一章 宏和預(yù)編譯_第3頁
C基礎(chǔ)PPT課件第十一章 宏和預(yù)編譯_第4頁
C基礎(chǔ)PPT課件第十一章 宏和預(yù)編譯_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第十一章 宏和預(yù)編譯 1-2課程內(nèi)容安排課程內(nèi)容安排預(yù)編譯器及其工作方式。預(yù)編譯器及其工作方式。宏的定義和使用。宏的定義和使用。使用宏時(shí)需要注意的問題。使用宏時(shí)需要注意的問題。條件編譯。條件編譯。1-3預(yù)處理器和編譯器預(yù)處理器和編譯器 預(yù)處理器是專門用來處理預(yù)處理指令的程序。在編譯器預(yù)處理器是專門用來處理預(yù)處理指令的程序。在編譯器運(yùn)行之前,會(huì)先運(yùn)行預(yù)處理器,查找所有的預(yù)處理指令運(yùn)行之前,會(huì)先運(yùn)行預(yù)處理器,查找所有的預(yù)處理指令。預(yù)處理指令是以。預(yù)處理指令是以“#”開頭,且不以開頭,且不以“;”結(jié)束,以區(qū)結(jié)束,以區(qū)分一般的語句。預(yù)處理器根據(jù)預(yù)處理指令生成新的源代分一般的語句。預(yù)處理器根據(jù)預(yù)處理指令

2、生成新的源代碼文件(臨時(shí)文件,可以通過編譯器的選項(xiàng)輸出到指定碼文件(臨時(shí)文件,可以通過編譯器的選項(xiàng)輸出到指定目錄)。目錄)。編譯器的作用是把源代碼轉(zhuǎn)化成匯編語言或機(jī)器指令。編譯器的作用是把源代碼轉(zhuǎn)化成匯編語言或機(jī)器指令。但是,編譯器并不是直接編譯程序員生成的源文件,而但是,編譯器并不是直接編譯程序員生成的源文件,而是經(jīng)預(yù)處理器處理后所產(chǎn)生的新的源文件。是經(jīng)預(yù)處理器處理后所產(chǎn)生的新的源文件。 1-4預(yù)處理器的任務(wù)預(yù)處理器的任務(wù) 簡(jiǎn)單來講,預(yù)處理器的任務(wù)就是執(zhí)行源代碼中的預(yù)處理簡(jiǎn)單來講,預(yù)處理器的任務(wù)就是執(zhí)行源代碼中的預(yù)處理指令,并對(duì)源代碼進(jìn)行相應(yīng)的處理。因此從預(yù)處理指令指令,并對(duì)源代碼進(jìn)行相應(yīng)的

3、處理。因此從預(yù)處理指令的類型來講,預(yù)處理器的任務(wù)包括如下的幾個(gè)部分。的類型來講,預(yù)處理器的任務(wù)包括如下的幾個(gè)部分。將其他文件包含到當(dāng)前文件中;將其他文件包含到當(dāng)前文件中;定義宏,用來取代某些復(fù)雜文本;定義宏,用來取代某些復(fù)雜文本;定義類似函數(shù)的宏,以更加靈活的方式控制源代碼;定義類似函數(shù)的宏,以更加靈活的方式控制源代碼;實(shí)施條件編譯,即有選擇的編譯源代碼的某些部分。實(shí)施條件編譯,即有選擇的編譯源代碼的某些部分。1-5宏的作用宏的作用 使用預(yù)處理指令使用預(yù)處理指令#define定義的宏主要有三個(gè)方面的作用:定義的宏主要有三個(gè)方面的作用:替代字面常量;替代字面常量;替代運(yùn)算符;替代運(yùn)算符;聲明某個(gè)

4、符號(hào)已經(jīng)被定義,通常用于條件編譯。聲明某個(gè)符號(hào)已經(jīng)被定義,通常用于條件編譯。1-6替代字面常量替代字面常量 用宏替代字面常量是宏非常重要的一個(gè)功能。其好處是用宏替代字面常量是宏非常重要的一個(gè)功能。其好處是直觀、簡(jiǎn)潔、修改方便。譬如對(duì)于圓周率直觀、簡(jiǎn)潔、修改方便。譬如對(duì)于圓周率,其值是一,其值是一個(gè)無理數(shù)常量,個(gè)無理數(shù)常量,3.14159。如果在程序中每一處要使用圓周率的地方都直接書寫這如果在程序中每一處要使用圓周率的地方都直接書寫這個(gè)常量,那么源代碼修改起來就不太方便。一旦要求改個(gè)常量,那么源代碼修改起來就不太方便。一旦要求改變數(shù)字的精度,減少或增加變數(shù)字的精度,減少或增加的小數(shù)位數(shù),則所有使

5、用的小數(shù)位數(shù),則所有使用到的地方都要修改。無疑修改量會(huì)比較大,而且容易出到的地方都要修改。無疑修改量會(huì)比較大,而且容易出錯(cuò)。錯(cuò)。 1-7帶參數(shù)的宏帶參數(shù)的宏 定義帶參數(shù)宏的語法同定義函數(shù)類似,在緊跟在宏名之定義帶參數(shù)宏的語法同定義函數(shù)類似,在緊跟在宏名之后有用括號(hào)包圍起來的參數(shù)列表,但沒有返回值類型、后有用括號(hào)包圍起來的參數(shù)列表,但沒有返回值類型、參數(shù)類型等的聲明。如下所示:參數(shù)類型等的聲明。如下所示:#define 宏名宏名(參數(shù)參數(shù)1, 參數(shù)參數(shù)2, 參數(shù)參數(shù)n) 可替換文本可替換文本如果可替換文本一行寫不完,可以分成多行,并在每一如果可替換文本一行寫不完,可以分成多行,并在每一行的結(jié)尾處

6、加上續(xù)行符號(hào)行的結(jié)尾處加上續(xù)行符號(hào)“”,除了最后一行。,除了最后一行。 1-8c/c+中的宏指令都是在中的宏指令都是在ansi標(biāo)準(zhǔn)中的。標(biāo)準(zhǔn)中的。 宏指令宏指令 #define#define#error#error#include#include#if#if#else#else#elif#elif#endif#endif#ifdef#ifdef#ifndef#ifndef#undef#undef#line#line#pragma#pragma1-9預(yù)定義的宏指令為程序提供了條件編譯的功能。條件編譯可以按預(yù)定義的宏指令為程序提供了條件編譯的功能。條件編譯可以按不同的條件去編譯不同的程序部分,因而

7、產(chǎn)生不同的目標(biāo)代碼不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。這對(duì)于程序的移植和調(diào)試是很有用的。文件。這對(duì)于程序的移植和調(diào)試是很有用的。c+中的條件編中的條件編譯有三種形式譯有三種形式 1. #ifdef形式形式2. #ifndef形式形式3. #if形式形式利用預(yù)定義的宏指令進(jìn)行條件編譯利用預(yù)定義的宏指令進(jìn)行條件編譯 1-10文件包含命令,就是指宏指令文件包含命令,就是指宏指令#include。通常有兩種形。通常有兩種形式的包含。第一種是尖括號(hào)包含的文件,表示要到系統(tǒng)式的包含。第一種是尖括號(hào)包含的文件,表示要到系統(tǒng)目錄下去尋找被包含的文件。第二種是引號(hào)包含的文件目錄下去尋找被

8、包含的文件。第二種是引號(hào)包含的文件,表示在當(dāng)前工程目錄中去尋找被包含的文件。,表示在當(dāng)前工程目錄中去尋找被包含的文件。 文件包含命令和包含警衛(wèi)文件包含命令和包含警衛(wèi) 1-11小結(jié)小結(jié) 本章主要介紹了本章主要介紹了c+中編譯預(yù)處理的基本內(nèi)容,主要包中編譯預(yù)處理的基本內(nèi)容,主要包括宏、文件包含和條件編譯三部分內(nèi)容。本章首先括宏、文件包含和條件編譯三部分內(nèi)容。本章首先討論預(yù)編譯器及其工作方式,接著重點(diǎn)宏的概念、討論預(yù)編譯器及其工作方式,接著重點(diǎn)宏的概念、作用,以及如何定義和使用宏。最后講解了作用,以及如何定義和使用宏。最后講解了c+中中的宏指令和預(yù)定義宏的內(nèi)容,以及如何利用預(yù)定義的宏指令和預(yù)定義宏的

9、內(nèi)容,以及如何利用預(yù)定義宏進(jìn)行條件編譯等內(nèi)容。學(xué)習(xí)完本章,讀者應(yīng)對(duì)編宏進(jìn)行條件編譯等內(nèi)容。學(xué)習(xí)完本章,讀者應(yīng)對(duì)編譯器編譯譯器編譯c+源程序的過程有一定理解。源程序的過程有一定理解。 1-12習(xí)題習(xí)題 【題目題目155】從下面的選項(xiàng)中選出正確的答案,在宏定義從下面的選項(xiàng)中選出正確的答案,在宏定義#define max 100中,宏名中,宏名max代替的是?代替的是?a實(shí)型數(shù)實(shí)型數(shù)b整型數(shù)整型數(shù)c常量常量d一串字符一串字符【分析分析】該試題主要考查宏定義的相關(guān)概念。在宏替換中,該試題主要考查宏定義的相關(guān)概念。在宏替換中,不管宏名是什么標(biāo)識(shí)符,其替代的都是一個(gè)常量,這個(gè)不管宏名是什么標(biāo)識(shí)符,其替代的

10、都是一個(gè)常量,這個(gè)常量也不會(huì)區(qū)分浮點(diǎn)型、整型或字符型等數(shù)據(jù)類型,而常量也不會(huì)區(qū)分浮點(diǎn)型、整型或字符型等數(shù)據(jù)類型,而是在具體的程序引用中進(jìn)行區(qū)分。因此,該試題中宏名是在具體的程序引用中進(jìn)行區(qū)分。因此,該試題中宏名max代替的是一個(gè)常量。代替的是一個(gè)常量。1-13【題目題目156】編寫一個(gè)標(biāo)準(zhǔn)宏編寫一個(gè)標(biāo)準(zhǔn)宏min,這個(gè)宏輸入兩個(gè)參數(shù)并返,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè),注意參數(shù)在調(diào)用時(shí)可能是表達(dá)式的情況?;剌^小的一個(gè),注意參數(shù)在調(diào)用時(shí)可能是表達(dá)式的情況。【分析分析】該試題主要考查宏定義的定義和使用。宏定義可以實(shí)該試題主要考查宏定義的定義和使用。宏定義可以實(shí)現(xiàn)類似于函數(shù)的功能,但是它終歸不是函

11、數(shù),而宏定義中現(xiàn)類似于函數(shù)的功能,但是它終歸不是函數(shù),而宏定義中括弧中的括弧中的“參數(shù)參數(shù)”也不是真的參數(shù),在宏展開的時(shí)候?qū)σ膊皇钦娴膮?shù),在宏展開的時(shí)候?qū)Α皡?shù)參數(shù)”進(jìn)行的是一對(duì)一的替換。讀者需要謹(jǐn)慎地將宏定義進(jìn)行的是一對(duì)一的替換。讀者需要謹(jǐn)慎地將宏定義中的中的“參數(shù)參數(shù)”和整個(gè)宏用用括弧括起來,所以嚴(yán)格地講下和整個(gè)宏用用括弧括起來,所以嚴(yán)格地講下述解答都是錯(cuò)誤的:述解答都是錯(cuò)誤的:#define min(a,b) (a) = (b) ? (a) : (b)#define min(a,b) (a = b ? a : b )正確的寫法應(yīng)如下所示:正確的寫法應(yīng)如下所示:#define min(a

12、,b) (a) = (b) ? (a) : (b)1-14【題目題目157】編寫一個(gè)編寫一個(gè)c+程序,在程序中定義一個(gè)不帶參程序,在程序中定義一個(gè)不帶參數(shù)的宏數(shù)的宏pi,使其完成求給定半徑的圓的周長(zhǎng)和面積。,使其完成求給定半徑的圓的周長(zhǎng)和面積?!痉治龇治觥吭撛囶}主要考查宏在具體程序中的應(yīng)用。根據(jù)前面該試題主要考查宏在具體程序中的應(yīng)用。根據(jù)前面章節(jié)的學(xué)習(xí),讀者知道求給定圓半徑的周長(zhǎng)和面積可以章節(jié)的學(xué)習(xí),讀者知道求給定圓半徑的周長(zhǎng)和面積可以通過聲明變量和常量來實(shí)現(xiàn),其中由于通過聲明變量和常量來實(shí)現(xiàn),其中由于pi是不會(huì)變的,是不會(huì)變的,其值為其值為3.14,因此可以將其聲明為常量。在學(xué)習(xí)了宏后,因此

13、可以將其聲明為常量。在學(xué)習(xí)了宏后,可以將該常量聲明為宏,其他語句不變。,可以將該常量聲明為宏,其他語句不變。1-15【題目題目158】什么是預(yù)編譯,何時(shí)需要預(yù)編譯?什么是預(yù)編譯,何時(shí)需要預(yù)編譯?【分析分析】預(yù)編譯就是指程序執(zhí)行前的一些預(yù)處理工作,其主預(yù)編譯就是指程序執(zhí)行前的一些預(yù)處理工作,其主要指用要指用#來表示的一系列表達(dá)式。使用預(yù)編譯主要針對(duì):來表示的一系列表達(dá)式。使用預(yù)編譯主要針對(duì):a.總是使用不經(jīng)常改動(dòng)的大型代碼體。總是使用不經(jīng)常改動(dòng)的大型代碼體。 b.程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,

14、可以將所有包含件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。文件預(yù)編譯為一個(gè)預(yù)編譯頭。1-16【題目題目159】定義一個(gè)帶參數(shù)的宏定義一個(gè)帶參數(shù)的宏swap,使其完成兩個(gè)整數(shù),使其完成兩個(gè)整數(shù)的交換功能。的交換功能?!痉治龇治觥吭撛囶}主要考查帶參數(shù)宏的定義和使用。試題要求該試題主要考查帶參數(shù)宏的定義和使用。試題要求宏完成兩個(gè)整數(shù)的交換功能,根據(jù)前面學(xué)習(xí)的內(nèi)容,讀宏完成兩個(gè)整數(shù)的交換功能,根據(jù)前面學(xué)習(xí)的內(nèi)容,讀者知道不適用第三方變量可以實(shí)現(xiàn)兩個(gè)值的交換,即通者知道不適用第三方變量可以實(shí)現(xiàn)兩個(gè)值的交換,即通過兩個(gè)變量的復(fù)合賦值運(yùn)算來實(shí)現(xiàn),此處同樣可以通過過兩個(gè)變量的復(fù)合

15、賦值運(yùn)算來實(shí)現(xiàn),此處同樣可以通過定義該賦值運(yùn)算從而完成宏定義該賦值運(yùn)算從而完成宏swap的實(shí)現(xiàn)。的實(shí)現(xiàn)。1-17【題目題目160】宏可以帶參數(shù),而且?guī)?shù)的宏與帶參數(shù)的函宏可以帶參數(shù),而且?guī)?shù)的宏與帶參數(shù)的函數(shù)的寫法和調(diào)用都很相似,但是其存在本質(zhì)上的不同,數(shù)的寫法和調(diào)用都很相似,但是其存在本質(zhì)上的不同,其區(qū)別在何處,請(qǐng)?jiān)囍ㄟ^兩個(gè)例子進(jìn)行說明。其區(qū)別在何處,請(qǐng)?jiān)囍ㄟ^兩個(gè)例子進(jìn)行說明?!痉治龇治觥吭撛囶}主要考查函數(shù)和宏的區(qū)別。函數(shù)調(diào)用時(shí)要把該試題主要考查函數(shù)和宏的區(qū)別。函數(shù)調(diào)用時(shí)要把實(shí)參表達(dá)式的值求出來再賦予形參,而宏代換中對(duì)實(shí)參實(shí)參表達(dá)式的值求出來再賦予形參,而宏代換中對(duì)實(shí)參表達(dá)式不作計(jì)算

16、直接地代換。這導(dǎo)致了即使把同一表達(dá)表達(dá)式不作計(jì)算直接地代換。這導(dǎo)致了即使把同一表達(dá)式用函數(shù)處理與用宏處理,兩者的結(jié)果有可能是不同的式用函數(shù)處理與用宏處理,兩者的結(jié)果有可能是不同的。下面通過具體例子進(jìn)行說明,如下分別定義了一個(gè)帶。下面通過具體例子進(jìn)行說明,如下分別定義了一個(gè)帶參宏和帶參函數(shù),其函數(shù)名為參宏和帶參函數(shù),其函數(shù)名為sq,形參為,形參為y,函數(shù)體表,函數(shù)體表達(dá)式為達(dá)式為(y)*(y),而宏定義也定義字符串為,而宏定義也定義字符串為(y)*(y)。1-18【題目題目161】用預(yù)處理指令用預(yù)處理指令#define 聲明一個(gè)常數(shù),用以表聲明一個(gè)常數(shù),用以表明明1年中有多少秒(忽略閏年問題)年

17、中有多少秒(忽略閏年問題)【分析分析】該試題主要考查該試題主要考查#define指令。讀者需明確指令。讀者需明確#define 語法的基本知識(shí),懂得預(yù)處理器計(jì)算常數(shù)表達(dá)式的值,語法的基本知識(shí),懂得預(yù)處理器計(jì)算常數(shù)表達(dá)式的值,因此直接寫出是如何計(jì)算一年中有多少秒而不是計(jì)算出因此直接寫出是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值。此外,讀者需意識(shí)到這個(gè)表達(dá)式將使一個(gè)實(shí)際的值。此外,讀者需意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出,因此要用到長(zhǎng)整型符號(hào)位機(jī)的整型數(shù)溢出,因此要用到長(zhǎng)整型符號(hào)l,告訴編譯,告訴編譯器這個(gè)常數(shù)是長(zhǎng)整型數(shù)。在表達(dá)式中用到器這個(gè)常數(shù)是長(zhǎng)整型數(shù)。在表達(dá)式中用到ul(表示無符

18、(表示無符號(hào)長(zhǎng)整型),因此,該問題的答案如下號(hào)長(zhǎng)整型),因此,該問題的答案如下#define seconds_per_year (60 * 60 * 24 * 365)ul1-19【題目題目162】下列敘述正確的是:(下列敘述正確的是:( )。)。a一個(gè)程序中可以有多個(gè)一個(gè)程序中可以有多個(gè)#include命令行命令行b#include命令行中,用雙引號(hào)和用尖括號(hào)將被包含的文件名括起命令行中,用雙引號(hào)和用尖括號(hào)將被包含的文件名括起來沒有區(qū)別來沒有區(qū)別c#include命令行只能放在程序開始位置命令行只能放在程序開始位置d#include命令后也必須以分號(hào)結(jié)束命令后也必須以分號(hào)結(jié)束【分析分析】該試題主要考查該試題主要考查#include命令的使用。在編譯預(yù)處理中,命令的使用。在編譯預(yù)處理中,#include命令主要用于聲明包含文件,其一般放在程序開始位置命令主要用于聲明包含文件,其一般放在程序開始位置,但可以放任意位置。,但可以放任意位置。#include命令不需加上分號(hào)表示結(jié)束,因

溫馨提示

  • 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)論