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