全國計算機等級考試2C課程第10講預(yù)編譯處理課件
,,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,作者:張旭仟 版權(quán)所有 歡迎盜版,*,全國計算機等級考試 2C課程,第十講 編譯預(yù)處理命令,11/4/2024,1,作者:張旭仟 版權(quán)所有 歡迎盜版,全國計算機等級考試 2C課程第十講 編譯預(yù)處理命令9/21/,編譯預(yù)處理命令的基本概念,ANSI C規(guī)定,可以在C源程序中加入一些“編譯預(yù)處理命令” ,以改進程序設(shè)計環(huán)境,提高編程效率。例如:,#define PI 3.14159,#include ,雖然這些“編譯預(yù)處理命令”也是由ANSI C統(tǒng)一規(guī)定的,但它們并非C語言的組成部分。含有這種 “編譯預(yù)處理命令”的源程序,只有在正式編譯之前先對它們進行“預(yù)處理”后,才能被正常編譯成“目標程序”。,C語言提供的預(yù)處理命令主要有:,宏定義命令,、,文件包含命令,、,條件編譯命令,。,為了與一般C語句相區(qū)別,這些編譯預(yù)處理命令”都以 “?!碧栭_頭。,11/4/2024,2,作者:張旭仟 版權(quán)所有 歡迎盜版,編譯預(yù)處理命令的基本概念A(yù)NSI C規(guī)定,可以在C源程序中加,不帶參數(shù)的宏替換命令,不帶參數(shù)的宏替換命令,一般形式:,#define 標識符 字符串,例如:,#define PI 3.1415926,其中“#define”是宏定義命令, PI 稱為“宏名”, “3.1415926”稱為宏體。,作用是將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。,在預(yù)編譯時將宏名替換成字符串的過程稱為“宏展開”。,11/4/2024,3,作者:張旭仟 版權(quán)所有 歡迎盜版,不帶參數(shù)的宏替換命令不帶參數(shù)的宏替換命令9/21/20233,不帶參數(shù)的宏替換命令,說明:,(1)#define命令、宏名、宏體之間必須用空格隔開;,(2)由于宏定義不是C語言程序語句,行的末尾不需要加“;”號;如果加了分號則會作為宏體的一部分被一起置換。,(3)宏名習(xí)慣上一般用大寫字母表示,以便與普通變量名區(qū)別。但這并非語法規(guī)定,即用小寫字母并不屬于語法錯誤;,(4)程序中被加上雙引號“”的宏名,將不能被替換,如:printf(“PI”);語句中的PI不會被替換為3.1415926;,(5)適當使用宏名代替一個字符串,可以減少程序中重復(fù)書寫某些復(fù)雜數(shù)據(jù)的工作量。,11/4/2024,4,作者:張旭仟 版權(quán)所有 歡迎盜版,不帶參數(shù)的宏替換命令說明:9/21/20234作者:張旭仟,不帶參數(shù)的宏替換命令,例如:,#include ,#define PI 3.1415926,void main(),{ float l,s,r,v;,printf("input radius:");,scanf("%f",,l=2.0*PI*r;,s=PI*r*r;,v=4.0/3*PI*r*r*r;,printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);,},運行情況如下:,1=25.1328,s=50.2655,v=150.7966,11/4/2024,5,作者:張旭仟 版權(quán)所有 歡迎盜版,不帶參數(shù)的宏替換命令例如: #include <stdio.,不帶參數(shù)的宏替換命令,(6) 宏定義是用宏名代替一個字符串,只作簡單置換,并不對字符串(宏體)作正確性檢查。,(7) #define命令通常寫在文件開頭或函數(shù)之前。默認情況下,宏名的有效范圍,是從宏定義命令之后開始,直到本源文件結(jié)束。,(8)當然,也可以用#undef命令,提前終止宏定義的作用范圍。如:,#define G 9.8,__,void main(),{ G的有效范圍,…,},__,#undef G,f1(),{,…,},11/4/2024,6,作者:張旭仟 版權(quán)所有 歡迎盜版,不帶參數(shù)的宏替換命令(6) 宏定義是用宏名代替一個字符串,只,不帶參數(shù)的宏替換命令,(9) 在進行宏定義時,可以引用已定義的宏名,宏展開時將會層層置換。,例如:,,#include ,#define R 3.0,#define PI 3.1415926,#define L 2*PI*R,#define S PI*R*R,void main(),{ printf("L=%f\nS=%f\n",L,S);,},編譯預(yù)處理時:,printf(“L=%f\nS=%f\n”,L,S); 語句將被展開為,printf(“L=%f\nS=%f\n”,2*3.1415926*3.0,3.1415926*3.0*3.0);,11/4/2024,7,作者:張旭仟 版權(quán)所有 歡迎盜版,不帶參數(shù)的宏替換命令(9) 在進行宏定義時,可以引用已定義的,帶參數(shù)的宏定義,帶參數(shù)的宏定義,作用:不只進行簡單的字符串替換,還進行參數(shù)的替換。,一般形式為:,#define 宏名(參數(shù)表)字符串,,例如:,#define,S(a,b) a*b,,?,area=S(3,2);,說明:,程序中用3和2分別代替宏定義中的形式參數(shù)a和b,用3*2代替,S(3,2),。因此賦值語句展開為:,area=3*2,11/4/2024,8,作者:張旭仟 版權(quán)所有 歡迎盜版,帶參數(shù)的宏定義帶參數(shù)的宏定義例如:說明:9/21/20238,帶參數(shù)的宏定義,對帶參的宏定義是這樣展開置換的:,對帶實參的宏,如S(3,2),基本原則也是按define命令行中指定的字符串從左到右進行置換的。,但如果字符串中包含有宏名中定義的形參,如: “a*b”中的a和b,則要用程序中相應(yīng)的實參(可以是常量、變量或表達式)來代替;其他字符,如“a*b”中的*號,則原樣保留。,圖中S(3,2)將被置換為3*2,其中3和2是實參,將代替指定字符串a(chǎn)*b中的a和b,*不是參數(shù),則被原樣保留。,11/4/2024,9,作者:張旭仟 版權(quán)所有 歡迎盜版,帶參數(shù)的宏定義對帶參的宏定義是這樣展開置換的:圖中S(3,2,帶參數(shù)的宏定義,例如:,#include ,#define PI 3.1415926,#define S(r) PI*r*r,void main(),{ float a,area;,a=3.6;,area=S(a);,printf("r=%f\narea=%f\n",a,area);,},說明:,賦值語句“area=S(a);” 展開后被替換為:,area=3.1415926,*a*a;,運行結(jié)果:,r=3.600000,area=40.715038,11/4/2024,10,作者:張旭仟 版權(quán)所有 歡迎盜版,帶參數(shù)的宏定義例如: #include 說,文件包含命令,所謂“文件包含”,是指一個源文件可以將另外一個源文件的全部內(nèi)容包括進來。,C語言提供了#include命令用來實現(xiàn)“文件包含”的操作。其一般形式為:,#include "文件名" 或 #include ,說明:,(1)在#include命令中,文件名可以用雙撇號或尖括號括起來。,(2)一個#include命令只能指定一個被包含文件,如果要包含n個文件,要用n個#include命令。,11/4/2024,11,作者:張旭仟 版權(quán)所有 歡迎盜版,文件包含命令所謂“文件包含”,是指一個源文件可以將另外一個源,文件包含命令,說明:,(3) 在一個被包含文件中又可以包含另一個被包含文件,即文件包含是可以嵌套的。如下圖所示,#include ,A,#include ,B,,C,file1.c,file2.c,file3.c,,,C,B,C,11/4/2024,12,作者:張旭仟 版權(quán)所有 歡迎盜版,文件包含命令說明:#include A#i,?,小練習(xí):,1、以下敘述中錯誤的是 (2008年4月),A)在程序中凡是以“?!遍_始的語句行都是預(yù)處理命令行,B)預(yù)處理命令行的最后不能以分號表示結(jié)束,C)#define MAX是合法的宏定義命令行,D)C程序?qū)︻A(yù)處理命令行的處理是在程序執(zhí)行的過程中進行的,11/4/2024,13,作者:張旭仟 版權(quán)所有 歡迎盜版,?小練習(xí):1、以下敘述中錯誤的是 (2008年4月)9/21,?,小練習(xí):,2、有以下程序(2010年3月),#include ,#define SUB(a) (a)-(a),main(),{ int a=2,b=3,c=5,d;,d=SUB(a+b)*c;,printf("%d\n",d);,},程序運行后的輸出結(jié)果是,A)0 B)-12 C)-20 D)10,11/4/2024,14,作者:張旭仟 版權(quán)所有 歡迎盜版,?小練習(xí):2、有以下程序(2010年3月)9/21/2023,?,小練習(xí):,3、有以下程序(2009年9月),#include,#define f(x) x*x*x,main(),{ int a=3,s,t; 3+1*3+1*3+1,s=f(a+1);,t=f((a+1));,printf("%d,%d",s,t);,},程序運行后的輸出結(jié)果是,A)10,64 B)10,10 C)64,10 D)64,64,11/4/2024,15,作者:張旭仟 版權(quán)所有 歡迎盜版,?小練習(xí):3、有以下程序(2009年9月)9/21/2023,?,小練習(xí):,4、有以下程序,#include ,#define PT 3.5;,#define S(x) PT*x*x;,mian(),{ int a=1, b=2;,printf(“%4.1f\n”,S(a+b)); 3.5*1+2*1+2,},程序運行后輸出的結(jié)果是,A)14.0 B)31.5,C)7.5 D)程序有錯無輸出結(jié)果,11/4/2024,16,作者:張旭仟 版權(quán)所有 歡迎盜版,?小練習(xí):4、有以下程序9/21/202316作者:張旭仟,?,小練習(xí):,5、有一個名為init.txt的文件,內(nèi)容如下:,#define HDY(A,B) A/B,#define PRINT(Y) printf(“y=%d\n”,Y),有以下程序,#include "stdio.h",#include "init.txt",main(),{ int a=1,b=2,c=3,d=4,k;,k=HDY(a+c,b+d);,PRINT(k);,},下面針對該程序的敘述正確的是(D),A)編譯有錯 B)運行出錯,C)運行結(jié)果為 y=0 D) 運行結(jié)果為 y=6,11/4/2024,17,作者:張旭仟 版權(quán)所有 歡迎盜版,?小練習(xí):5、有一個名為init.txt的文件,內(nèi)容如下:9,,,Thank listen!,11/4/2024,18,作者:張旭仟 版權(quán)所有 歡迎盜版,Thank listen! 9/21/202318作者:張旭,