編譯預處理在源程序文件中,加入編譯預處理命令,使編譯程序_第1頁
編譯預處理在源程序文件中,加入編譯預處理命令,使編譯程序_第2頁
編譯預處理在源程序文件中,加入編譯預處理命令,使編譯程序_第3頁
編譯預處理在源程序文件中,加入編譯預處理命令,使編譯程序_第4頁
編譯預處理在源程序文件中,加入編譯預處理命令,使編譯程序_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 編譯預處理:編譯預處理:在源程序文件中,加入在源程序文件中,加入“編譯預處理命編譯預處理命令令”,使編譯程序在對源程序進行通常的編譯(包括,使編譯程序在對源程序進行通常的編譯(包括詞法分析、語法分析、代碼生成、代碼優化)之前,詞法分析、語法分析、代碼生成、代碼優化)之前,先對這些命令進行預處理,然后將預處理的結果和源先對這些命令進行預處理,然后將預處理的結果和源程序一起再進行通常的編譯處理,以得到目標代碼程序一起再進行通常的編譯處理,以得到目標代碼(OBJ文件)。文件)。 C提供的編譯預處理命令提供的編譯預處理命令 宏命令(宏命令(Macro) 文件包含命令(文件包含命令(include)

2、條件編譯命令條件編譯命令 這些命令均以這些命令均以#開頭,以區別于語句。開頭,以區別于語句。一、不帶參數的宏一、不帶參數的宏一般形式:一般形式: #define 標識符標識符 字符串字符串如:如: #define PI 3.1415926作用:用標識符(稱為作用:用標識符(稱為“宏名宏名”)PI代替字符串代替字符串“3.1415926”。在預編譯時,將源程序中出現的宏名在預編譯時,將源程序中出現的宏名PI替換為字符串替換為字符串“3.1415926”,這一替換過程稱為這一替換過程稱為“宏展開宏展開”。#define:宏定義命令:宏定義命令#undef:終止宏定義命令:終止宏定義命令例例PI 3

3、.1415926 main()float l,s,r,v; printf(input radius:);scanf(%f,&r); /* 輸入圓的半徑輸入圓的半徑 */l = 2.0*PI*r; /* 圓周長圓周長 */ s = PI*r*r; /* 圓面積圓面積 */v = 4.0/3.0*PI*r*r*r; /* 球體積球體積 */printf(l=%10.4fns=%10.4fnv=%10.4fn,l,s,v);關于宏定義的說明:關于宏定義的說明:1、一般宏名用大寫字母表示。(變量名一般用小寫字母)。、一般宏名用大寫字母表示。(變量名一般用小寫字母)。2、使用宏可以提高程序的可讀

4、性和可移植性。如上述程序中,多處、使用宏可以提高程序的可讀性和可移植性。如上述程序中,多處需要使用需要使用值,用宏名既便于修改又意義明確。值,用宏名既便于修改又意義明確。3、宏定義是用宏名代替、宏定義是用宏名代替字符串字符串,宏擴展時僅作簡單替換,不檢查語,宏擴展時僅作簡單替換,不檢查語法。語法檢查在編譯時進行。法。語法檢查在編譯時進行。4、宏定義不是、宏定義不是C語句,后面不能有分號。如果加入分號,則連分號語句,后面不能有分號。如果加入分號,則連分號一起替換。一起替換。如:如:#define PI 3.1415926;area = P*r*r;在宏擴展后成為:在宏擴展后成為:area = 3

5、.1315926;*r*r;結果,在編譯時出現語法錯誤。結果,在編譯時出現語法錯誤。5、通常把、通常把#define命令放在一個文件的開頭,使其在命令放在一個文件的開頭,使其在本文件全部有效。(本文件全部有效。(#define定義的宏僅在本文件有定義的宏僅在本文件有效,在其它文件中無效,這與全局變量不同)。效,在其它文件中無效,這與全局變量不同)。6、宏定義終止命令、宏定義終止命令 #undef結束先前定義的宏名。結束先前定義的宏名。#define G 9.8main()#undef G /* 取消取消G的意義的意義 */f1()7、宏定義中可以引用已定義的宏名。、宏定義中可以引用已定義的宏名

6、。例例8.2 #define R 3.0#define PI 3.1415926#deinfe L 2*PI*R #define S PI*R*Rmain()printf(L=%fnS=%fn,L,S); 8、對程序中用雙引號括起來的字符串,即使與宏名相同,也不替換。、對程序中用雙引號括起來的字符串,即使與宏名相同,也不替換。例如上例的例如上例的printf語句中,雙引號括起來語句中,雙引號括起來L和和S不被替換。不被替換。二、帶參數的宏二、帶參數的宏一般形式:一般形式:#define 宏名(參數表)宏名(參數表) 字符串字符串帶參數的宏在展開時,不是進行簡單的字符串替換,而帶參數的宏在展開時

7、,不是進行簡單的字符串替換,而是進行參數替換。例、是進行參數替換。例、例例#define PI 3.1415926#define S(r) PI*r*rmain() float a, area;a = 3.6;area = S(a); printf(r=%fnarea=%fn,a,area);說明:說明: 帶參數的宏展開時,用實參字符串替換形參字符串,注意可能發帶參數的宏展開時,用實參字符串替換形參字符串,注意可能發生的錯誤。比較好的辦法是宏定義的形參加括號。生的錯誤。比較好的辦法是宏定義的形參加括號。例例 返回多個值的宏定義。返回多個值的宏定義。#define PI 3.1415926#de

8、fine CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4/3*PI*R*R*Rmain() float r,l,s,v; /*半徑、圓周長、圓面積、球體積半徑、圓周長、圓面積、球體積 */scanf(%f,&r);CIRCLE(r,l,s,v); printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);輸出結果輸出結果:文件包含命令的一般格式是:文件包含命令的一般格式是:#include “文件名文件名”作用:預處理時,把作用:預處理時,把“文件名文件名”指定的文件內容復制到指定的文件內容復制到本文件,再對合并后的文

9、件進行編譯。本文件,再對合并后的文件進行編譯。例、例、在在file1.c文件中,有文件包含命令文件中,有文件包含命令#include file2.c,預處理時,先把預處理時,先把file2.c的內容復制到文件的內容復制到文件file1.c,再,再對對file1.c進行編譯。進行編譯。從理論上說,從理論上說,#include命令可以包含任何類型的文件,命令可以包含任何類型的文件,只要這些文件的內容被擴展后符合只要這些文件的內容被擴展后符合C語言語法。語言語法。一般一般#include命令用于包含擴展名為命令用于包含擴展名為.h的的“頭文件頭文件”,如如stdio.h、string.h、math.

10、h。在這些文件中,一。在這些文件中,一般定義符號常量、宏,或聲明函數原型。般定義符號常量、宏,或聲明函數原型。說明:說明:1、一個、一個include命令只能指定一個被包含文件,如果要包含命令只能指定一個被包含文件,如果要包含n個文件,用個文件,用n個個Include命令。命令。2、#include命令的文件名,可以使用兩種括號。命令的文件名,可以使用兩種括號。#include file2.h 先在引用被包含文件的目錄查找先在引用被包含文件的目錄查找file2.h文件,若沒有,文件,若沒有,再到系統指定的目錄查找。再到系統指定的目錄查找。 #include 僅在系統指定的目錄查找文件僅在系統指

11、定的目錄查找文件file2.h。(2)文件)文件file1.c#include print_format.h“main() int a,b,c,d;char string = CHINA;a = 1; b = 2; c = 3; d = 4;PR(D1,a);PR(D2,a,b); PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);程序員也可以把自己定義的符號常量、程序員也可以把自己定義的符號常量、宏,或函數原型放在頭文件中,用宏,或函數原型放在頭文件中,用#include命令包含這些頭文件。命令包含這些頭文件。(1)文件)文件print_format.h#de

12、fine PR printf#define NL n#define D %d #define D1 D NL#define D2 D D NL#define D3 D D D NL#define D4 D D D D NL#define S %s 條件編譯條件編譯:一般情況下:一般情況下,源程序中所有的行都參加編譯。源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是編譯,也就是對一部分內容指定編譯的條件,這就是“條條件編譯件編譯”。條件編譯命令有以下幾種形式條件編譯命令有以下幾種形式(1)#ifdef 標識符標識符 程序段程序段1 #else 程序段程序段2 #endif它的作用是:當所指定的標識符已經被除數它的作用是:當所指定的標識符已經被除數#define命令命令定義過,則在程序編譯階段只編譯程序段定義過,則在程序編譯階段只編譯程序段1,否則編譯否則編譯程序段程序段2. (2)#ifdef 標識符標

溫馨提示

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

評論

0/150

提交評論