#define const typedef
#define用法
1. 定義簡單的常數:定義常量,便于修改
#define N 1000
2.?定義簡單的函數:注意多使用括號
define可以像函數那樣接受一些參數,如下:
#define max(x,y) (x)>(y)?(x):(y)
這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個“函數”沒有類型檢查,就好像一個函數模板似的,當然,它絕對沒有模板那么安全就是了。可以作為一個簡單的模板來使用而已。但是這樣做的話存在隱患,例子如下:
#define Add(a,b) a+b;
在一般使用的時候是沒有問題的,但是如果遇到如:c * Add(a,b) * d的時候就會出現問題,代數式的本意是a+b然后去和c,d相乘,但是因為使用了define(它只是一個簡單的替換),所以式子實際上變成了
c*a + b*d
?
const常量與define宏定義的區別
編譯器處理方式不同:
define宏是在預處理階段展開。const常量是編譯運行階段使用。
類型和安全檢查不同:
define宏沒有類型,不做任何類型檢查,僅僅是展開。const常量有具體的類型,在編譯階段會執行類型檢查。
存儲方式不同:
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
const常量會在內存中分配(可以是堆中也可以是棧中)。
?
C++的const比C語言#define更好的原因?
首先,它能夠明確指定類型,有類型檢查功能。
其次,可以使用C++的作用域規則將定義限制在特定的函數或文件中。
第三,可以將const用于更復雜的類型,比如數組和結構。
C語言中也有const,其與C++中const的區別是:一是作用域規則不同;另一個是,在C++中可以用const值來聲明數組長度。C編譯器不能把const看成一個編譯期間的常量,即C編譯器不知道它在編譯時的值。
===========================================================
對宏定義的使用要非常小心,特別要注意兩個問題:
(1)謹慎地將宏定義中的“參數”和整個宏用括弧括起來。如定義最小宏:#define MIN(A,B) ( (A) <= (B) ? (A) : (B) ) ,所以,嚴格地講,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B) // #define MIN(A,B) (A <= B ? A : B ) 都應判0分;
(2)防止宏的副作用。對MIN(*p++, b)的作用結果是:((*p++) <= (b) ? (*p++) : (*p++)) ,這個表達式會產生副作用,指針p會作三次++自增操作。
?
typedef用法
簡化復雜的類型聲明
簡化復雜的類型聲明,或給已有類型起一含義明確的別名;如:
typedef?bool?(*FuncPointer)(int,?double); //聲明了一個返回?bool?類型并帶有兩個(int和double)形參的函數的指針類型FuncPointer
FuncPointer?pFunc; //聲明了一個FuncPointer類型的函數指針對象pFunc
定義與平臺無關的類型
定義與平臺無關的類型,屏蔽不同平臺的類型差異化;如:
用typedef來定義與平臺無關的類型。
比如定義一個叫?REAL?的浮點類型,在目標平臺一上,讓它表示最高精度的類型為:
typedef?long?double?REAL;
在不支持?long?double?的平臺二上,改為:
typedef?double?REAL;
在連?double?都不支持的平臺三上,改為:
typedef?float?REAL;
也就是說,當跨平臺時,只要改下?typedef?本身就行,不用對其他源碼做任何修改。
標準庫就廣泛使用了這個技巧,比如size_t。另外,因為typedef是定義了一種類型的新別名,不是簡單的字符串替換,所以它比宏來得穩健。
與struct的結合使用
在C++中,struct與class的作用相同,就是默認的訪問權限不同,struct默認為public,而class默認為private的。
但是在C語言中,struct的定義和聲明要用typedef。如果沒有typedef就必須用struct?Person?person;來聲明
?
typedef與#define的區別
執行時間不同
關鍵字typedef在編譯階段有效,由于是在編譯階段,因此typedef有類型檢查的功能。
#define則是宏定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字符串替換,而不進行任何檢查。
功能有差異
typedef用來定義類型的別名,定義與平臺無關的數據類型,與struct的結合使用等。
#define不只是可以為類型取別名,還可以定義常量、變量、編譯開關等。
作用域不同
#define沒有作用域的限制,只要是之前預定義過的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
參考:http://blog.csdn.net/luoweifu/article/details/41630195
?
轉載于:https://www.cnblogs.com/raichen/p/5837377.html
總結
以上是生活随笔為你收集整理的#define const typedef的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP Ajax 跨域问题最佳解决方案
- 下一篇: Django-Json 数据返回