c语言宏定义_掌握C语言,中文编程不是梦
文/Edward
前面我們?cè)谥v節(jié)程序編譯的時(shí)候,編譯器做的第一步就是預(yù)處理。C語言的預(yù)處理,其實(shí)是編譯器在對(duì)整個(gè)工程編譯之前做的一些文本性質(zhì)的工作,例如我們經(jīng)常使用的#include,這就是一個(gè)典型的文件包含預(yù)處理,當(dāng)啟動(dòng)編譯的時(shí)候,編譯器首先先做預(yù)處理,即將#include后面包含的那個(gè)文件里面的內(nèi)容,全部復(fù)制到當(dāng)前的.c文件中來,接著,再進(jìn)行C語言源文件的編譯。除了文件包含之外,C語言中的預(yù)處理還有很多,而這些預(yù)處理對(duì)于我們編程來說,都可以幫助我們提高代碼的易讀性和代碼質(zhì)量。
#define預(yù)處理
#define預(yù)處理的作用,一般在一些書上面僅僅稱其為“宏定義”,其實(shí)這個(gè)稱呼是不嚴(yán)謹(jǐn)?shù)?#xff0c;一個(gè)#define預(yù)處理其實(shí)包含兩種意思,第一種意思是“宏定義”,第二個(gè)層面的意思是替換,下面的內(nèi)容,我們將會(huì)以上面兩層意思分開講解。
#define替換
也許我們?cè)趩纹瑱C(jī)編程中,絕大多數(shù)用戶使用的僅僅只是#define預(yù)處理的替換功能,#define的替換格式為:
#define NAME 需要替換的內(nèi)容
比如,我們一般常用的用來定義圓周率Π,就可以寫成:
#define PI 3.1415926
那么以后的程序代碼里面只要出現(xiàn)PI這個(gè)標(biāo)號(hào),編譯器都將直接將其替換成一個(gè)浮點(diǎn)數(shù)3.1415926。
在用#define定義標(biāo)號(hào)的時(shí)候需要注意,一般地我們都以大寫字母來拼寫這個(gè)標(biāo)號(hào),而且這個(gè)標(biāo)號(hào)在用#define定義時(shí),我們都默認(rèn)地將其放入相應(yīng)的.h頭文件中。如圖1所示的求圓形面積和周長的程序。
圖1 求圓的周長和面積用#define定義的標(biāo)號(hào)不止可以替換一些數(shù)值,還可以替換關(guān)鍵詞和函數(shù),例如,想要讓C語言變成一個(gè)中文的編程語言,就可以直接用#define定義中文標(biāo)號(hào)來替換C語言的關(guān)鍵詞,如圖2所示。
圖2 用中文編寫C語言需要注意的是,MinGW編譯器自身不支持中文類型的變量,所以如果要嘗試只能在Visual studio軟件中使用MSVC來嘗試。
#define除了可以替換數(shù)值、關(guān)鍵詞和函數(shù)之外,還可以用來替換程序語句,我們可以將需要執(zhí)行的程序語句,利用#define重新定義成一個(gè)標(biāo)號(hào),如圖3所示。
圖3 #define替換程序語句在圖3中,我們利用#define定義了一個(gè)程序計(jì)算語句,這個(gè)標(biāo)號(hào)在程序執(zhí)行的時(shí)候就會(huì)自動(dòng)被替換成后面的2*3運(yùn)算語句去執(zhí)行了。接著我們?cè)賮砜匆欢未a。如8-1-4所示。
圖4 錯(cuò)誤的#define替換按照我們正常的理解,圖4中的程序理論上來說應(yīng)該輸出25才對(duì),但是為什么結(jié)果卻和我們想象的不一樣呢?這是因?yàn)?define定義的標(biāo)號(hào)在編譯的時(shí)候是文本直接替換的,因此當(dāng)在程序里面執(zhí)行STENCE*STENCE的時(shí)候,我們認(rèn)為的應(yīng)該執(zhí)行(2+3)*(2+3),而實(shí)際上STENCE是直接被2+3替換的,所以在程序編譯時(shí)的真實(shí)替換應(yīng)該是2+3*2+3,因此輸出的值才和我們想象中的不一樣,這就是典型的#define替換錯(cuò)誤。只需要在2+3外面加上括號(hào)即可,如圖5所示。
圖5 正確的#define程序語句替換而當(dāng)我們?cè)谔鎿Q多條語句的時(shí)候,一定要用“do{……}while(0);“的形式來將標(biāo)號(hào)里面的多條執(zhí)行語句打包好,以防止不必要的錯(cuò)誤產(chǎn)生。如圖6所示。
圖6 #define替換多條程序語句定義宏
#define除了用作簡單和復(fù)雜的程序文本替換之外,這個(gè)機(jī)制還包括了一個(gè)規(guī)定,即可以將參數(shù)替換到文本中去進(jìn)行計(jì)算,這種實(shí)現(xiàn)通常被稱為宏(macro)。
宏定義的聲明方式為:
#define 宏名稱(參數(shù)1, 參數(shù)2, ……) 帶參數(shù)的表達(dá)式
當(dāng)宏被調(diào)用時(shí),參數(shù)列表中的每一個(gè)值都會(huì)與宏表達(dá)式實(shí)體中的每一個(gè)值所一一對(duì)應(yīng),并且進(jìn)行替換。如,我們定義一個(gè)用于計(jì)算平方的宏,就可以寫成:
#define SQUARE(x) x*x
下面程序使用宏定義計(jì)算5的平方,就可以直接使用SQUARE(5)。
如圖7所示,我們可以將圓的面積和周長計(jì)算分別寫成宏的形式進(jìn)行運(yùn)算。
圖7 宏定義計(jì)算圓的周長和面積但是還需要注意的是,宏定義的參數(shù)替換也僅僅是文本形式的替換,如圖8所示。
圖8 宏定義的錯(cuò)誤計(jì)算圖8的程序中,我們?cè)鞠氲氖?#xff0c;輸入的半徑變成11之后,通過調(diào)用宏,并且傳入?yún)?shù)rad + 1,理論上來說應(yīng)該和8-1-7中輸出一樣的計(jì)算結(jié)果才對(duì),但是實(shí)際上,這個(gè)傳入的參數(shù)在替換時(shí)也是僅僅被當(dāng)作文本去替換了,因此圖8程序?qū)嶋H的計(jì)算過程應(yīng)該是,以周長為例,2*3.1415926*11+1=70.12。所以在宏定義的時(shí)候,我們也應(yīng)該為其參數(shù)增加括號(hào),以提高整個(gè)宏的完整性。如圖9所示。
圖9 宏定義參數(shù)的正常使用除了上述的功能之外,宏定義最常被使用的就是比較兩個(gè)數(shù)的大小了,之前我們比較兩個(gè)書的大小都是使用if來判斷的,但是學(xué)了宏之后,結(jié)合三目運(yùn)算符就可以直接使用一個(gè)宏定義來完成了,如圖10所示。
圖10 使用宏定義比較大小http://weixin.qq.com/r/BjsfB7PEhO77rfdk924U (二維碼自動(dòng)識(shí)別)
總結(jié)
以上是生活随笔為你收集整理的c语言宏定义_掌握C语言,中文编程不是梦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: led显示屏背景墙设计_全彩LED显示屏
- 下一篇: 如何在freemarker寻找元素_如何