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