版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)第第8 8章章 編譯預(yù)處理編譯預(yù)處理Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C問題:實(shí)際生活中,為了更好地處理一些事件或數(shù)據(jù),會問題:實(shí)際生活中,為了更好地處理一些事件或數(shù)據(jù),會對其提前進(jìn)行設(shè)定和準(zhǔn)備,如:對其提前進(jìn)行設(shè)定和準(zhǔn)備,如: 在對源程序進(jìn)行通常的編譯之前,先對程序在對源程序進(jìn)行通常的編譯之前,先對程序中一些特殊的命令進(jìn)行中一些特殊的命令進(jìn)
2、行“預(yù)處理預(yù)處理”。用用代表圓周率代表圓周率3.143.14為避免重復(fù),對已有的實(shí)行為避免重復(fù),對已有的實(shí)行“拿來主義拿來主義”。 ANSI C ANSI C標(biāo)準(zhǔn)規(guī)定可以在源程序中加入標(biāo)準(zhǔn)規(guī)定可以在源程序中加入一些一些“預(yù)處理命令預(yù)處理命令” ” ,以改進(jìn)程序設(shè)計(jì)環(huán),以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。境,提高編程效率。引子引子Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C 本章要點(diǎn)本章要點(diǎn)第第8 8章章 編譯預(yù)處理編譯預(yù)處理 本章難點(diǎn)本章難點(diǎn)n 預(yù)處理的概念預(yù)處理的概念n C語言處理系統(tǒng)的預(yù)處理功能語言處理系統(tǒng)
3、的預(yù)處理功能n 預(yù)處理命令的使用預(yù)處理命令的使用Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C編譯預(yù)處理編譯預(yù)處理作用:作用:對源程序編譯之前做一些處理對源程序編譯之前做一些處理, ,生成擴(kuò)生成擴(kuò)展展C C源程序源程序種類種類宏定義宏定義 #define#define文件包含文件包含 #include#include條件編譯條件編譯 #if-#else-#endif#if-#else-#endif等等格式:格式:“#”#”開頭開頭占單獨(dú)書寫行占單獨(dú)書寫行語句尾不加分號語句尾不加分號Copyright Henan
4、 Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C8.18.28.3宏定義宏定義條件編譯條件編譯文件包含文件包含第第8 8章章 編譯預(yù)處理編譯預(yù)處理Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C如如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”);展開后:展開后: if(x=1) printf(“correct!n”); else if (x=0) printf(“error!n”)
5、;宏定義的分類宏定義的分類不帶參數(shù)宏定義不帶參數(shù)宏定義一般形式:一般形式: #define #define 宏名宏名 宏體宏體 功能功能: :用指定標(biāo)識符用指定標(biāo)識符( (宏名宏名) )代替字符序列代替字符序列( (宏體宏體) )宏展開:預(yù)編譯時宏展開:預(yù)編譯時, ,用宏體替換宏名用宏體替換宏名-不作語法檢查不作語法檢查如如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);宏體可缺省宏體可缺省, ,表示宏名表示宏名定義過或取消宏體定義過或取消宏體定義位置定義位置: :任意任意(
6、(一般在函數(shù)外面一般在函數(shù)外面) )作用域作用域: :從定義命令到文件結(jié)束從定義命令到文件結(jié)束# #undefundef可終止宏名作用域可終止宏名作用域 格式:格式: #undef#undef 宏名宏名例例 #define YES 1 main() . #undef YES #define YES 0 max() . YESYES原作用域原作用域YESYES新作用域新作用域宏定義可嵌套,不能遞歸宏定義可嵌套,不能遞歸例例 #define MAX MAX+10 ( )引號中的內(nèi)容與宏名相同也不置換引號中的內(nèi)容與宏名相同也不置換例例 #define PI 3.14159 printf(“2*PI=
7、%fn”,PI*2);宏展開宏展開:printf(“2*PI=%fn”,3.14159*2);宏定義中使用必要的括號宏定義中使用必要的括號()()例例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展開宏展開:var= 80+40 *2;( )( )例例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展開宏展開:var= 80+40 *2;8.1 8.1 宏定義宏定義Copyright Henan Polytechnic University 語語言言第第 8 8 章
8、章編編譯譯預(yù)預(yù)處處理理C C例例8.1 8.1 用不帶參數(shù)的宏定義計(jì)算用不帶參數(shù)的宏定義計(jì)算s=3s=3* *(y(y* *y+3y+3* *y)+4y)+4* *(y(y* *y+3y+3* *y)+5y)+5* *(y(y* *y+3y+3* *y)y)#define M (y*y+3*y)main() int s,y; printf(Please input a number: ); scanf(%d,&y); s=3*M+4*M+5*M; printf(s=%dn,s);運(yùn)行情況如下:運(yùn)行情況如下:Please input a number: 4 s=336 算法分析:算法分析
9、:單在計(jì)算式子中出現(xiàn)了三個單在計(jì)算式子中出現(xiàn)了三個(y(y* *y+3y+3* *y)y),為減,為減少書寫量,可使用宏定義。少書寫量,可使用宏定義。 Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C帶參數(shù)宏定義帶參數(shù)宏定義一般形式:一般形式: #define #define 宏名宏名( (參數(shù)表參數(shù)表) ) 宏體宏體例例 #define S (r) PI*r*r相當(dāng)于定義了不帶參宏相當(dāng)于定義了不帶參宏S,代表字符串代表字符串“(r) PI*r*r” 宏展開:宏展開:形參用實(shí)參換,其它字符保留形參用實(shí)參換,其它字
10、符保留宏體及各形參外一般應(yīng)加括號宏體及各形參外一般應(yīng)加括號()()例例 #define S(a,b) a*b . area=S(3,2);宏展開宏展開: area=3*2;不能加空格不能加空格例例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展開:宏展開:z=x+y*x+y;一般寫成:一般寫成: #define POWER(x) (x)*(x)宏展開:宏展開: z=(x+y)*(x+y);8.1 8.1 宏定義宏定義Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C#d
11、efine MAX(x,y) (x)(y)?(x):(y) main() int x,y,max; printf(input two numbers(x,y): ); scanf(%d,%d,&x,&y); max=MAX(x,y); printf(max=%dn,max);例例8.4 8.4 用帶參宏定義求兩數(shù)中的大者。用帶參宏定義求兩數(shù)中的大者。運(yùn)行情況如下:運(yùn)行情況如下:input two numbers(x,y): 5,6 max=6例例8.5 8.5 一個宏定義代表多條語句。一個宏定義代表多條語句。#define SSSV(s1,s2,s3,v) s1=l*w; s2
12、=l*h; s3=w*h; v=w*l*h;main() int l=3,w=4,h=5,sa,sb,sc,vv; SSSV(sa,sb,sc,vv); printf(sa=%dnsb=%dnsc=%dnvv=%dn,sa,sb,sc,vv);運(yùn)行情況如下:運(yùn)行情況如下:sa=12sb=15sc=20vv=60Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C帶參的宏與函數(shù)區(qū)別帶參的宏與函數(shù)區(qū)別帶參宏帶參宏函數(shù)函數(shù)處理過程處理過程不分配內(nèi)存不分配內(nèi)存簡單的簡單的字符置換字符置換分配內(nèi)存分配內(nèi)存先求實(shí)參值先求實(shí)參值,
13、再代入形參再代入形參處理時間處理時間編譯時編譯時程序運(yùn)行時程序運(yùn)行時參數(shù)類型參數(shù)類型無類型問題無類型問題定義實(shí)參定義實(shí)參,形參類型形參類型返回值返回值無無有有運(yùn)行速度運(yùn)行速度不占運(yùn)行時間不占運(yùn)行時間調(diào)用和返回占時間調(diào)用和返回占時間Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C8.18.28.3宏定義宏定義條件編譯條件編譯文件包含文件包含第第8 8章章 編譯預(yù)處理編譯預(yù)處理Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C條件編譯的功
14、能:在編譯源文件之前,根據(jù)條件編譯的功能:在編譯源文件之前,根據(jù)給定的條件決定編譯的范圍。給定的條件決定編譯的范圍。形式一:形式一: #ifdef#ifdef 標(biāo)識符標(biāo)識符 程序段程序段1 1 #else #else 程序段程序段2 2 #endif #endif如果標(biāo)識符是已被如果標(biāo)識符是已被 #define#define命令定義過的宏名,就對程命令定義過的宏名,就對程序段序段1 1進(jìn)行編譯;否則對程序進(jìn)行編譯;否則對程序段段2 2進(jìn)行編譯。進(jìn)行編譯。8.2 8.2 條件編譯條件編譯沒有沒有elseelse時,可省略時,可省略Copyright Henan Polytechnic Unive
15、rsity 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C條件編譯舉例條件編譯舉例#define DEBUG main() int a=4; #ifdef DEBUG printf(Now the programmer is debugging the program.); #else printf(a=%d.,a); #endif若沒有第一行的宏定義命令,程序運(yùn)行后會輸出:若沒有第一行的宏定義命令,程序運(yùn)行后會輸出:a=4.運(yùn)行情況如下:運(yùn)行情況如下:Now the programmer is debugging the program.Copyright Henan Polytech
16、nic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C條件編譯條件編譯形式二:形式二:#if#ifn ndefdef 標(biāo)識符標(biāo)識符 程序段程序段1 1 #else #else 程序段程序段2 2 #endif #endif如果標(biāo)識符如果標(biāo)識符未未被被#define#define命令定命令定義過,就對程序段義過,就對程序段1 1進(jìn)行編譯;進(jìn)行編譯;否則對程序段否則對程序段2 2進(jìn)行編譯。進(jìn)行編譯。形式三:形式三:#if #if 常量表達(dá)式常量表達(dá)式 程序段程序段1 1 #else #else 程序段程序段2 2 #endif #endif如果常量表達(dá)式的值為如果常量表
17、達(dá)式的值為真真( (非非0)0),就對程序段就對程序段1 1進(jìn)行編譯;否則對進(jìn)行編譯;否則對程序段程序段2 2進(jìn)行編譯。進(jìn)行編譯。Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C例例8.10 8.10 設(shè)置一個開關(guān),判斷輸入值是半徑還是邊長,設(shè)置一個開關(guān),判斷輸入值是半徑還是邊長,實(shí)現(xiàn)求圓或正方形的面積。實(shí)現(xiàn)求圓或正方形的面積。#define R 1main() float c,r,s; printf (input a number:); scanf(%f,&c); #if R r=3.14159*c*c
18、; printf(area of round is: %fn,r); #else s=c*c; printf(area of square is: %fn,s); #endif運(yùn)行情況如下:運(yùn)行情況如下:input a number:3 area of round is: 28.274309若程序的第一行改為:若程序的第一行改為:#define R 0則程序運(yùn)行情況如下:則程序運(yùn)行情況如下:input a number:3 area of square is: 9.000000Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處
19、處理理C C條件編譯的應(yīng)用條件編譯的應(yīng)用一套程序要產(chǎn)生不同的版本一套程序要產(chǎn)生不同的版本( (如演示版本和實(shí)際版本如演示版本和實(shí)際版本) )、避免重復(fù)定義時,往往使用條件編譯。避免重復(fù)定義時,往往使用條件編譯。在程序調(diào)試時,經(jīng)常需要查看某些變量的中間結(jié)果。在程序調(diào)試時,經(jīng)常需要查看某些變量的中間結(jié)果。這時可以使用條件編譯,在程序中設(shè)置若干調(diào)試用的這時可以使用條件編譯,在程序中設(shè)置若干調(diào)試用的語句。例如:語句。例如:#define FLAG 1#define FLAG 1 #if FLAG #if FLAG printf(a printf(a=%d,a=%d,a););#endif#endifC
20、opyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C8.18.28.3宏定義宏定義條件編譯條件編譯文件包含文件包含第第8 8章章 編譯預(yù)處理編譯預(yù)處理Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C文件包含的功能:一個源文件可將另一個源文件包含的功能:一個源文件可將另一個源文件的內(nèi)容全部包含進(jìn)來。文件的內(nèi)容全部包含進(jìn)來。一一般形式:般形式: #include #include “文件名文件名” 或或 #include #include #
21、include “file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預(yù)編譯時處理過程:預(yù)編譯時, ,用被包含文件的內(nèi)容取代該預(yù)處理用被包含文件的內(nèi)容取代該預(yù)處理命令,再對命令,再對“包含包含”后的文件作一個源文件編譯。后的文件作一個源文件編譯。“”“” 先在先在當(dāng)前目錄當(dāng)前目錄搜搜索,再搜索標(biāo)準(zhǔn)目錄索,再搜索標(biāo)準(zhǔn)目錄;可指定路徑可指定路徑 直接按標(biāo)準(zhǔn)目錄搜直接按標(biāo)準(zhǔn)目錄搜索索,不能指定路徑,不能指定路徑8.3 8.3 文件包含文件包含例例 #include C:TCF2.c #include Copyright Henan Polytechnic Univ
22、ersity 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C被包含文件內(nèi)容被包含文件內(nèi)容源文件源文件( (* *.c).c)頭文件頭文件( (* *.h).h)stdio.h:EOF和和NULL宏定義及輸入輸出函數(shù)宏定義及輸入輸出函數(shù)的原型的原型 math.h:各個數(shù)學(xué)函數(shù)的原型:各個數(shù)學(xué)函數(shù)的原型 io.h:數(shù)據(jù)類型:數(shù)據(jù)類型struct ftime的定義的定義 文件包含可嵌套文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c 將那些公用的或常用的宏定義、函
23、數(shù)原型將那些公用的或常用的宏定義、函數(shù)原型、數(shù)據(jù)類型定義及全局變量的定義和聲明等,、數(shù)據(jù)類型定義及全局變量的定義和聲明等,組織在一些頭文件中,在程序需要使用到這些組織在一些頭文件中,在程序需要使用到這些信息時,就用信息時,就用#include命令把它們包含到所需的命令把它們包含到所需的位置上去,從而免去每次使用它們時都要重新位置上去,從而免去每次使用它們時都要重新定義或聲明的麻煩。定義或聲明的麻煩。Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C例例8.11 8.11 用戶頭文件的編寫和使用用戶頭文件的編寫和使用
24、 #ifndef _L8_11_H/ /* *定義宏,以防止重復(fù)包含此頭文件定義宏,以防止重復(fù)包含此頭文件* */ / #define _L8_11_H #include #define ADD(a,b) (a)+(b) / /* *定義宏,實(shí)現(xiàn)兩數(shù)的定義宏,實(shí)現(xiàn)兩數(shù)的加法加法* */ / #define SUB(a,b) (a)-(b) / /* *定義宏,實(shí)現(xiàn)兩數(shù)的定義宏,實(shí)現(xiàn)兩數(shù)的減法減法* */ / int MUL(int a,int b) / /* *定義函數(shù),實(shí)現(xiàn)兩數(shù)的定義函數(shù),實(shí)現(xiàn)兩數(shù)的乘法乘法* */ / return a*b; float DIV(float a,float
25、b) / /* *定義函數(shù),實(shí)現(xiàn)兩數(shù)的定義函數(shù),實(shí)現(xiàn)兩數(shù)的除法除法* */ / if(b!=0) return a/b; else printf(Error! The deno cannot be zero!); #endif頭文件頭文件 L8_11.h#include L8_11.h / /* *包含自定義頭文件包含自定義頭文件* */ /main() int a,b; int sum,product; float difference,quotient; printf(Please input two numbers:); scanf(%d,%d,&a,&b); sum=A
26、DD(a,b); difference=SUB(a,b); product=MUL(a,b); quotient=DIV(a,b); printf(sum=%d difference=%fn,sum,difference); printf(product=%d quotient=%fn,product,quotient);程序運(yùn)行情況如下:程序運(yùn)行情況如下:Please input two numbers:34,12 sum=46 difference=22.000000product=408 quotient=2.833333Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C注意注意一個一個#include#include命令只能包含一個頭文件,若有多個命令只能包含一個頭文件,若有多個文件要包含,則需用多個文件要包含,則需用多個#include#include命令。命令。例如:如果例如:如果file1.cfile1.c中包含中包含file2.cfile2.c,而,而file2.cfile2.c中要中要用到用到file3.cfile3
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023三年級語文下冊 第一單元 2 燕子配套說課稿 新人教版
- 2024-2025學(xué)年高中語文 名著導(dǎo)讀 莎士比亞戲劇說課稿 新人教版必修4
- 9古詩三首清明說課稿2023-2024學(xué)年統(tǒng)編版語文三年級下冊
- Unit 4 Natural Disasters Reading for Writing 說課稿-2024-2025學(xué)年高中英語人教版(2019)必修第一冊
- Unit 2 lconic Attractions Learning About Language (1)說課稿 2023-2024學(xué)年高中英語人教版選擇性第四冊
- 2025主體信用評級合同
- 2025吊頂勞務(wù)承包合同
- 19《夜宿山寺》(說課稿)2024-2025學(xué)年部編版語文二年級上冊
- 2024-2025學(xué)年高中生物 第一章 人體的內(nèi)環(huán)境與穩(wěn)態(tài) 專題1.2 內(nèi)環(huán)境穩(wěn)態(tài)的重要性說課稿(基礎(chǔ)版)新人教版必修3001
- 7《壓歲錢的使用與思考》(說課稿)-2023-2024學(xué)年四年級下冊綜合實(shí)踐活動長春版
- 北京市豐臺區(qū)2024-2025學(xué)年九年級上學(xué)期期末語文試題(含答案)
- 計(jì)劃供貨時間方案
- 2024年石柱土家族自治縣中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 西藏事業(yè)單位c類歷年真題
- 2024人教新目標(biāo)(Go for it)八年級英語下冊【第1-10單元】全冊 知識點(diǎn)總結(jié)
- 七年級英語下學(xué)期開學(xué)考試(深圳專用)-2022-2023學(xué)年七年級英語下冊單元重難點(diǎn)易錯題精練(牛津深圳版)
- 部編版語文小學(xué)二年級下冊第一單元集體備課(教材解讀)
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳畫冊
- 化學(xué)品-泄露與擴(kuò)散模型課件
- 漢語言文學(xué)論文6000字
- 樹立正確的世界觀人生觀價值觀課件
評論
0/150
提交評論