成人app

首頁  /  C語言教程  /  宏定義  /  

宏定義

點擊打開在線編譯器,邊學邊練

預處理命令可以改變程序設計環境,提高編程效率,它們并不是 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

下一課:文件包含
第一章 C語言的過去與未來
第二章 C語言快速入門
第三章 C語言的數據類型
第四章 C語言中的基本輸入輸出
第五章 運算符和表達式
第六章 C語句和程序流
第七章 函數
第八章 數組
第九章 指針
第十章 復合結構
第十一章 文件操作
第十二章 預處理
Dotcpp在線編譯      (登錄可減少運行等待時間)