C語言程序設計課件:編譯預處理_第1頁
C語言程序設計課件:編譯預處理_第2頁
C語言程序設計課件:編譯預處理_第3頁
C語言程序設計課件:編譯預處理_第4頁
C語言程序設計課件:編譯預處理_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設計

編譯預處理9.1宏定義

9.1.1符號常量宏定義

9.1.2帶參數(shù)宏定義

9.2文件包含命令

9.3條件編譯

9.3.1條件編譯概念

9.3.2條件編譯優(yōu)點

9.1宏定義

1.不帶參數(shù)宏定義一般格式: #define標識符字符串

其中:“define”為宏定義命令;“標識符”為所定義的宏名,通常用大寫字母表示,以便與變量區(qū)別;“語言符號字符串”可以是常數(shù)、表達式、格式串等。與其配對使用的是#undef,表示結(jié)束標志符的定義。9.1.1符號常量宏定義

用一個指定的標識符(即名字)來代表一個字符串。2.使用宏定義的優(yōu)點(1)可提高源程序的可維護性。(2)可提高源程序的可移植性。

(3)減少源程序中重復書寫字符串的工作量。例9-1宏定義應用。#include<stdio.h>

#definePR10voidmain(){inti=6;printf(“i+PR=%d\n”,i+PR);

#undefPR

#definePR50

printf(“i+PR=%d\n”,i+PR);}運行結(jié)果:i+PR=16i+PR=56(1)宏名一般用大寫字母表示,用來與變量區(qū)別。(2)宏定義不是C語句,所以不能在行尾加分號。否則,宏展開時,會將分號作為字符串的一個字符,用于替換宏名。(3)在宏展開時,預處理程序僅以按宏定義簡單替換宏名,而不作任何檢查。如果有錯誤,只能由編譯程序在編譯宏展開后的源程序時發(fā)現(xiàn)。(4)宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后,到本文件結(jié)束。通常,宏定義命令放在文件開頭處。

(5)在進行宏定義時,可以引用已定義的宏名。(6)對雙引號括起來的字符串內(nèi)的字符,即使與宏名同名,也不進行宏展開。應用宏可編寫通用性強的程序;可減少書寫錯誤。3.說明:(7)宏名常用在以下兩方面:用一個有意義的名字去代替含義不清的一串數(shù)字,比如用PI代表圓周率,用PAGE_SIZE代表每頁打印的行數(shù)等,如:#definePI3.14159265358979#definePAGE_SIZE66這樣在程序中使用PI和PAGE_SIZE比用3.14159265358979和66的含義明確多了,既簡單又清楚,既便于修改又可避免出錯。用一個短的名字去代替較長的名字如:#defineSTUstructstudentSTUstud1,stud2;即等價于structstudentstud1,stud2;(8)程序設計中常見的錯誤是宏定義時在宏值的后面加分號如:#definePI3.14159;則對s=2*PI*r;會替換成s=2*3.14159;*r;這會產(chǎn)生編譯錯誤。1.帶參數(shù)宏的一般格式:#define宏名(參數(shù)表)替換串2.帶參數(shù)宏的調(diào)用和宏展開調(diào)用格式:宏名(實參表);宏展開:用宏調(diào)用提供的實參字符串,直接置換宏定義命令行中、相應形參字符串,非形參字符保持不變。3.說明:(1)定義有參宏時,宏名與左圓括號之間不能留有空格。否則,C編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,而將該宏視為無參宏。(2)有參宏的展開,只是將實參作為字符串,簡單地置換形參字符串,而不做任何語法檢查。在定義有參宏時,在所有形參外和整個字符串外,均加一對圓括號。宏值中間的參數(shù)要用圓括號括起來。9.1.2帶參數(shù)宏定義

例9-3帶參數(shù)宏的應用。#include<stdio.h>#definePI3.141592/*宏定義

定義符號常量圓周率PI*/#defineS(r)(PI)*(r)*(r)/*宏定義

定義計算圓面積*/voidmain(){doubleR,area1,area2;printf("輸入圓半徑:");scanf("%lf",&R);area1=S(R);area2=S(R+5);printf("圓面積(r=%0.1f):%0.4f\n",R,area1);printf("圓面積(r=%0.1f+5):%0.4f\n",R,area2);}9.2文件包含命令功能:一個源文件可將另一個源文件的內(nèi)容全部包含進來一般形式:#include“文件名”或#include<文件名>處理過程:預編譯時,用被包含文件的內(nèi)容取代該預處理命令,再對“包含”后的文件作一個源文件編譯<>直接按標準目錄搜索“”先在當前目錄搜索,再搜索標準目錄可指定路徑#include“file2.c”file1.cfile2.cfile1.cfile2.cABA9.2文件包含命令文件包含的優(yōu)點:一個大程序,通常分為多個模塊,并由多個程序員分別編程。有了文件包含處理功能,就可以將多個模塊共用的數(shù)據(jù)(如符號常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個單獨的文件中。這樣,凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進來即可,不必再重復定義它們,從而減少重復勞動。即file1.c把file2.c的拷貝包含到自己的內(nèi)部,成為一個大文件,然后再一塊編譯,所以被包含文件file2.c應當是源文件,不應當是目標(.obj)文件。頭文件不能單獨編譯,它只能和C源程序文件一起進行編譯。9.2文件包含命令注意:(1)一個#include指令只能包含一個文件,要包含多個文件就要用多個#include指令。(2)文件包含可以嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.c

Bfile1.cAfile3.cfile2.c9.2文件包含命令注意:(3)被包含文件中的全局變量也是包含文件中的全局變量,因此在包含文件中對這些量不必再加extern說明即可加以引用。(4)被包含文件的擴展名一般用.h,表示是在文件開頭加進來的,其內(nèi)容可以是程序文件或數(shù)據(jù)文件,也可以是宏定義、全局變量聲明等。這些數(shù)據(jù)有相對的獨立性,可被多個文件使用,不必在多個文件中都去定義,而只在一個文件中定義,其他文件中包含這個定義文件即可。9.3條件編譯條件編譯可有效地提高程序的可移植性,并廣泛地應用在商業(yè)軟件中,為一個程序提供各種不同的版本。利用條件編譯,還可使同一源程序即適合于調(diào)試(進行程序跟蹤、打印較多的狀態(tài)或錯誤信息),又適合高效執(zhí)行要求。條件編譯主要有以下用途:(1)忽略程序的某一部分。(2)幫助程序調(diào)試9.3.1條件編譯概念

9.3條件編譯條件編譯格式條件編譯命令常常應用在頭文件中,防止標識符重定義。條件編譯命令有以下形式:格式1:

#ifdef標識符程序段1#else

程序段2#endif

#ifdef標識符 程序段1#endif標識符已經(jīng)#define定義,執(zhí)行程序段1;否則,執(zhí)行程序段2。格式2:

#ifndef標識符程序段1#else

程序段2#endif

#ifndef標識符 程序段1#endif標識符未經(jīng)#define定義,執(zhí)行程序段1;否則,執(zhí)行程序段2。9.3條件編譯條件編譯格式(1)提高了C源程序的通用性。(2)使調(diào)試程序等過程變得靈活。(3)使用條件編譯可以減少目標程序的長度例

輸入一行字母字符,根據(jù)需要設置條件編譯,使之能將字母全改為大寫字母輸出,或全改為小寫字母輸出。#defineLETTER1main(){charstr[20]=“CLanguage”,c;inti=0;while((c=str[i])!=’\0’){i++;#ifLETTERif(c>=’a’&&c<=’z’)c=c-32;#elseif(c>=’A’&&c<=’Z’)c=c+32;#endifprintf(“%c”,c);}}9

溫馨提示

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

最新文檔

評論

0/150

提交評論