預(yù)處理命令可以改變程序設(shè)計(jì)環(huán)境,提高編程效率,它們并不是C語言本身的組成部分,不能直接對(duì)它們進(jìn)行編譯,必須在對(duì)程序進(jìn)行編譯之前,先對(duì)程序中這些特殊的命令進(jìn)行“預(yù)處理”。經(jīng)過預(yù)處理后,程序就不再包括預(yù)處理命令了,最后再由編譯程序?qū)︻A(yù)處理之后的源程序進(jìn)行編譯處理,得到可供執(zhí)行的目標(biāo)代碼。C語言提供的預(yù)處理功能有三種,分別為宏定義、文件包含和條件編譯,下面將對(duì)它們進(jìn)行簡(jiǎn)單介紹。
宏定義在C語言源程序中允許用一個(gè)標(biāo)識(shí)符來表示一個(gè)字符串,稱為“宏”,被定義為“宏”的標(biāo)識(shí)符稱為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的宏名,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的,宏代換是由預(yù)處理程序自動(dòng)完成的。在C語言中,宏分為有參數(shù)和無參數(shù)兩種。無參宏的宏名后不帶參數(shù),其定義的一般形式為:
#define 標(biāo)識(shí)符 字符串;
其中“#”表示這是一條預(yù)處理命令(在C語言中凡是以“#”開頭的均為預(yù)處理命令)“define”為宏定義命令,“標(biāo)識(shí)符”為所定義的宏名,“字符串”可以是常數(shù)、表達(dá)式、格式串等。符號(hào)常量的定義就是一種無參宏定義。
此外,常常對(duì)程序中反復(fù)使用的表達(dá)式進(jìn)行宏定義。例如:
#define M (y*y+3*y);
它的作用是指定標(biāo)識(shí)符M來代替表達(dá)式(y*y+3*y)。
在編寫源程序時(shí),所有的(y*y+3*y)都可由M代替,而對(duì)源程序進(jìn)行編譯時(shí),將先由預(yù)處理程序進(jìn)行宏代換,即用(y*y+3*y)表達(dá)式去置換所有的宏名M,然后再進(jìn)行編譯。
C語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實(shí)際參數(shù)。對(duì)于帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實(shí)參去代換形參。
帶參宏定義的一般形式為:
#define 宏名(形參表) 字符串;
在字符串中含有各個(gè)形參。
帶參宏調(diào)用的一般形式為:
宏名(實(shí)參表);
例如:
#define M(y) y*y+3*y /*宏定義*/ ...... k=M(5); /*宏調(diào)用*/
......
在上面的宏調(diào)用時(shí),用實(shí)參5去代替形參y,經(jīng)預(yù)處理宏展開后的語句為:
k=5*5+3*5;
程序2.26給出了一個(gè)宏定義和調(diào)用的完整實(shí)例。
定義一個(gè)名為MAX的帶參數(shù)的宏,可以通過它來選出參數(shù)a、b中的較大值:test26.c。
#include <stdio.h> #define MAX(a,b) (a>b)?a:b /*帶參數(shù)的宏定義*/ main() { int x,y,max; printf("input two numbers: "); scanf("%d %d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); /*宏調(diào)用*/ }</stdio.h>
程序運(yùn)行結(jié)果如下(□表示空格,↙表示回車):
input two numbers: 2009□2010↙ max=2010
可以看到,宏替換相當(dāng)于實(shí)現(xiàn)了一個(gè)函數(shù)調(diào)用的功能,而事實(shí)上,與函數(shù)調(diào)用相比,宏調(diào)用更能提高C程序的執(zhí)行效率。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程