預處理命令可以改變程序設計環境,提高編程效率,它們并不是 C 語言本身的組成部分,不能直接對 它們進行編譯,必須在對程序進行編譯之前,先對程序中這些特殊的命令進行“預處理” 。經過預處理后,程序就不再包括預處理命令了,最后再由編譯程序對預處理之后的源程序進行編譯處理,得到可供執行的 目標代碼。C 語言提供的預處理功能有三種,分別為宏定義、文件包含和條件編譯,下面將對它們進行簡 單介紹。
宏定義 在 C 語言源程序中允許用一個標識符來表示一個字符串,稱為“宏” ,被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。 宏定義是由源程序中的宏定義命令完成的,宏代換是由預處理程序自動完成的。在 C 語言中,宏分為 有參數和無參數兩種。無參宏的宏名后不帶參數,其定義的一般形式為:
#define 標識符 字符串;
其中“#”表示這是一條預處理命令(在 C 語言中凡是以“#”開頭的均為預處理命令)“define”為宏定義命令,“標識符”為所定義的宏名, “字符串”可以是常數、表達式、格式串等。符號常量的定義就是一種無參宏定義。
此外,常常對程序中反復使用的表達式進行宏定義。例如:
#define M (y*y+3*y);
成人app
它的作用是指定標識符 M 來代替表達式(y*y+3*y)。
在編寫源程序時, 所有的(y*y+3*y)都可由 M 代替, 而對源程序進行編譯時,將先由預處理程序進行宏代換,即用(y*y+3*y)表達式去置換所有的宏名 M,然后 再進行編譯。
C語言允許宏帶有參數。在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對于帶 參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。
帶參宏定義的一般形式為:
#define 宏名(形參表) 字符串;
在字符串中含有各個形參。
帶參宏調用的一般形式為:
宏名(實參表);
例如:
成人app
#define M(y) y*y+3*y /*宏定義*/ ...... k=M(5); /*宏調用*/
......
在上面的宏調用時,用實參 5 去代替形參 y,經預處理宏展開后的語句為:
k=5*5+3*5;
程序 2.26 給出了一個宏定義和調用的完整實例。
成人app定義一個名為 MAX 的帶參數的宏,可以通過它來選出參數 a、b 中的較大值:test26.c。
#include <stdio.h> #define MAX(a,b) (a>b)?a:b /*帶參數的宏定義*/ main() { int x,y,max; printf("input two numbers: "); scanf("%d %d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); /*宏調用*/ }</stdio.h>
成人app程序運行結果如下(□表示空格,↙表示回車) :
input two numbers: 2009□2010↙ max=2010
成人app
可以看到,宏替換相當于實現了一個函數調用的功能,而事實上,與函數調用相比,宏調用更能提高
C 程序的執行效率。
本文固定URL:http://hnsaiyang.com/course/43