c語言編譯預(yù)處理_第1頁
c語言編譯預(yù)處理_第2頁
c語言編譯預(yù)處理_第3頁
c語言編譯預(yù)處理_第4頁
c語言編譯預(yù)處理_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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è)計語言程序設(shè)計第第8 8章章 編譯預(yù)處理編譯預(yù)處理Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C問題:實際生活中,為了更好地處理一些事件或數(shù)據(jù),會問題:實際生活中,為了更好地處理一些事件或數(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ù),對已有的實行為避免重復(fù),對已有的實行“拿來主義拿來主義”。 ANSI C ANSI C標(biāo)準(zhǔn)規(guī)定可以在源程序中加入標(biāo)準(zhǔn)規(guī)定可以在源程序中加入一些一些“預(yù)處理命令預(yù)處理命令” ” ,以改進(jìn)程序設(shè)計環(huán),以改進(jìn)程序設(shè)計環(huán)境,提高編程效率。境,提高編程效率。引子引子Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C 本章重點本章重點第第8 8章章 編譯預(yù)處理編譯預(yù)處理 本章難點本章難點n 宏定義命令宏定義命令n 條件編譯命令條件編譯命令n 文件包含命令文

3、件包含命令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等等格式:格式:“#”#”開頭開頭占單獨書寫行占單獨書寫行語句尾不加分號語句尾不加分號Copyright Henan Polytechnic Univer

4、sity 語語言言第第 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”);宏定義的分類宏定義的分類無參數(shù)宏定義

5、無參數(shù)宏定義一般形式:一般形式: #define #define 標(biāo)識符標(biāo)識符 替換文本替換文本功能功能: :用指定標(biāo)識符用指定標(biāo)識符( (宏名宏名) )代替替換文本代替替換文本( (宏體宏體) )宏展開:預(yù)編譯時宏展開:預(yù)編譯時, ,用宏體替換宏名用宏體替換宏名-不作語法檢查不作語法檢查如如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);宏體可缺省宏體可缺省, ,表示宏名表示宏名定義過或取消宏體定義過或取消宏體定義位置定義位置: :任意任意( (一般在函數(shù)外面一般在函數(shù)外面)

6、 )作用域作用域: :從定義命令到文件結(jié)束從定義命令到文件結(jié)束# #undefundef可終止宏名作用域可終止宏名作用域 格式:格式: #undef#undef 標(biāo)識符標(biāo)識符例例 #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=%fn”,PI*2);宏展開

7、宏展開: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 章章編編譯譯預(yù)預(yù)處處理理C C

8、例例8.1 8.1 用不帶參數(shù)的宏定義計算用不帶參數(shù)的宏定義計算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);運行情況如下:運行情況如下:Please input a number: 4 s=336 算法分析:算法分析:單在計算式子中出現(xiàn)了三個單

9、在計算式子中出現(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” 宏展開:宏展開:形參用實參換,其它字符保留形參用實參換,其它字符保留宏體及各形參外

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#define MAX(

11、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ù)中的大者。運行情況如下:運行情況如下:input two numbers(x,y): 5,6 max=6例例8.5 8.5 一個宏定義代表多條語句。一個宏定義代表多條語句。#define SSSV(s1,s2,s3,v) s1=l*w; s2=l*h; s3=w

12、*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);運行情況如下:運行情況如下: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)存先求實參值先求實參值,再代入形參再代入形參

13、處理時間處理時間編譯時編譯時程序運行時程序運行時參數(shù)類型參數(shù)類型無類型問題無類型問題定義實參定義實參,形參類型形參類型返回值返回值無無有有運行速度運行速度不占運行時間不占運行時間調(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 University 語語言言

15、第第 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若沒有第一行的宏定義命令,程序運行后會輸出:若沒有第一行的宏定義命令,程序運行后會輸出:a=4.運行情況如下:運行情況如下:Now the programmer is debugging the program.Copyright Henan Polytechnic Univer

16、sity 語語言言第第 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á)式的值為如果常量表達(dá)式的值為真真( (

17、非非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),判斷輸入值是半徑還是邊長,實現(xiàn)求圓或正方形的面積。實現(xiàn)求圓或正方形的面積。#define R 1main() float c,r,s; printf (input a number:); scanf(%f,&c); #if R r=3.14159*c*c; printf(a

18、rea of round is: %fn,r); #else s=c*c; printf(area of square is: %fn,s); #endif運行情況如下:運行情況如下:input a number:3 area of round is: 28.274309若程序的第一行改為:若程序的第一行改為:#define R 0則程序運行情況如下:則程序運行情況如下:input a number:3 area of square is: 9.000000Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C條件編譯

19、的應(yīng)用條件編譯的應(yīng)用一套程序要產(chǎn)生不同的版本一套程序要產(chǎn)生不同的版本( (如演示版本和實際版本如演示版本和實際版本) )、避免重復(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#endifCopyright H

20、enan 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 #include “f

21、ile2.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 University 語語言

22、言第第 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 將那些公用的或常用的宏定義、函數(shù)原型將那些公用的或

23、常用的宏定義、函數(shù)原型、數(shù)據(jù)類型定義及全局變量的定義和聲明等,、數(shù)據(jù)類型定義及全局變量的定義和聲明等,組織在一些頭文件中,在程序需要使用到這些組織在一些頭文件中,在程序需要使用到這些信息時,就用信息時,就用#include命令把它們包含到所需的命令把它們包含到所需的位置上去,從而免去每次使用它們時都要重新位置上去,從而免去每次使用它們時都要重新定義或聲明的麻煩。定義或聲明的麻煩。Copyright Henan Polytechnic University 語語言言第第 8 8 章章編編譯譯預(yù)預(yù)處處理理C C例例8.11 8.11 用戶頭文件的編寫和使用用戶頭文件的編寫和使用 #ifndef _

24、L8_11_H/ /* *定義宏,以防止重復(fù)包含此頭文件定義宏,以防止重復(fù)包含此頭文件* */ / #define _L8_11_H #include #define ADD(a,b) (a)+(b) / /* *定義宏,實現(xiàn)兩數(shù)的定義宏,實現(xiàn)兩數(shù)的加法加法* */ / #define SUB(a,b) (a)-(b) / /* *定義宏,實現(xiàn)兩數(shù)的定義宏,實現(xiàn)兩數(shù)的減法減法* */ / int MUL(int a,int b) / /* *定義函數(shù),實現(xiàn)兩數(shù)的定義函數(shù),實現(xiàn)兩數(shù)的乘法乘法* */ / return a*b; float DIV(float a,float b) / /* *定

25、義函數(shù),實現(xiàn)兩數(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=ADD(a,b); d

26、ifference=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);程序運行情況如下:程序運行情況如下: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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論