C++ #define详解
1.#define 的作用
在C或C++語言源程序中允許用一個標識符來表示一個字符串,稱為“宏”。被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。
在C或C++語言中,“宏”分為有參數(shù)和無參數(shù)兩種。
無參宏的宏名后不帶參數(shù)。
其定義的一般形式為:
#define 標識符 字符串
其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為宏定義命令。“標識符”為所定義的宏名。“字符串”可以是常數(shù)、表達式、格式串等。
例如:
#define M (a+b)
它的作用是指定標識符M來代替表達式(a+b)。在編寫源程序時,所有的(a+b)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(a+b)表達式去置換所有的宏名M,然后再進行編譯。
程序1:
復制代碼
#define M (a+b)
main(){
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=M*M;
printf(“s=%d\n”,s);
}
復制代碼
上例程序中首先進行宏定義,定義M來替代表達式(a+b),在 s= M * M 中作了宏調(diào)用。在預處理時經(jīng)宏展開后該語句變?yōu)?#xff1a; S=(a+b)*(a+b)
但要注意的是,在宏定義中表達式(a+b)兩邊的括號不能少。否則會發(fā)生錯誤。
如當作以下定義后:#difine M (a)+(b)
在宏展開時將得到下述語句:S= (a)+(b)*(a)+(b)
對于宏定義還要說明以下幾點:
1. 宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達式,預處理程序?qū)λ蛔魅魏螜z查。如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)。
2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。
3. 宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結(jié)束。如要終止其作用域可使用#undef命令。
c語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實際參數(shù)。對帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實參去代換形參。
帶參宏定義的一般形式為:
#define 宏名(形參表) 字符串
在字符串中含有各個形參。
帶參宏調(diào)用的一般形式為:
宏名(形參表)
例如:
#define M(y) ((y)(y)+3(y)) /宏定義/
…
k=M(5); /宏調(diào)用/
…
在宏調(diào)用時,用實參5去代替形參y,經(jīng)預處理宏展開后的語句為:
k=55+35
程序2:
復制代碼
#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);
}
復制代碼
上例程序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現(xiàn)在條件表達式中。程序第七行max=MAX(x,y)為宏調(diào)用,實參x,y,將代換形參a,b。宏展開后該語句為:
max=(x>y)?x:y;
用于計算x,y中的大數(shù)。
4.防止重復定義
#define 條件編譯
頭文件(.h)可以被頭文件或C文件包含;
重復包含(重復定義)
由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個頭文件,就可能出現(xiàn)重復定義的問題的。
通過條件編譯開關來避免重復包含(重復定義)
例如
#ifndef headerfileXXX
#define headerfileXXX
…
文件內(nèi)容
…
#endif
轉(zhuǎn)載 https://www.cnblogs.com/shmilxu/p/4837373.html
總結(jié)
以上是生活随笔為你收集整理的C++ #define详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS密码校验规则前台验证(不能连续字符(
- 下一篇: 一套图 搞懂“时间复杂度”「建议收藏」(