總結:typedef和define可對乙個物件進行 取別名(typedef) 或 字元替換(define) ,以此增強程式的可讀性
typedeff是關鍵字,對已經存在的資料型別取別名。
在編譯階段處理,會進行型別檢查,只能在定義的作用域內使用。
define是預處理指令(巨集定義),只進行簡單的字元替換,是否產生錯誤要在編譯時才可知。
沒有作用域限制,可以對型別/變數/常量等進行替換
與const組合區別:
typedef
char
* pstr;
「const pstr」會被解釋為「char
*如果是define則會被解讀為const
char
1、typedef:它在自己的作用域內給乙個已經存在的型別乙個別名。它是在是在編譯時處理的。
int
main()
intfun()
2、#define 是預處理指令。在編譯預處理時進行簡單的替換(1)預處理:執行預處理指令,進行簡單的替換(替換後刪除預處理指令)。
#define a 3
intmain()
字元替換後其實等同於
int
main()
注意此時程式還遠遠沒有執行,只是編譯器在執行預處理(比如我們用記事本寫東西,假設可以傳送,那麼記事本先改正拼寫,然後再提交給別人,記事本自我改正拼寫的功能就是預處理)
顯而易見,預處理僅是進行簡單的字元替換,不作正確性檢查,不管含義是否正確,也沒有資料型別一說。
當要替換的字元和定義的變數同名時就會產生定義衝突,如下:
#define a 3
intmain()
(2)編譯:進行程式的語法檢查,檢查無錯程式再執行,否則直接報錯。
平時我們程式執行直接出錯,實際就是編譯檢查出語法錯誤,如上的定義衝突錯誤。程式還沒到執行的那一步。
所以define巨集替換,可能帶來的錯誤只有在編譯時才可能發現並報錯。
由上可知,define只是程式執行前的字元替換而已,不牽扯程式本身語法或者執行,因此想替換誰替換誰,也沒有作用域一說,至於錯誤,那是編譯時候檢查的事情了(單純字元替換對程式執行是缺點,可能造成各種錯誤)。
(3)執行時,可能產生的問題
#define x int*
typedef
int* y
x p1, p2;
等同於int
*p1,p2;
//乙個指標變數,乙個整形變數
y p1,p2;
//兩個都是指標變數
//int* 可以是乙個型別,顯然define把int當做型別,更印證的巨集替換沒有資料型別。
typedef和define具體的詳細區別
1 define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如 define pi 3.1415926 程式中的 area pi r r 會替換為3.1415926 r r 如果你把 define語句中...
typedef和define具體的詳細區別
1 define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如 define pi 3.1415926 程式中的 area pi r r 會替換為3.1415926 r r 如果你把 define語句中...
(程式設計基礎)define和typedef的區別
define和typedef有兩個主要的區別 1 可以使用其他型別說明符對巨集型別名進行擴充套件,但是對typedef所定義的型別名不能擴充套件 2 在連續的幾個變數的宣告中,用typedef定義的型別可以保證宣告中所有的變數均為同一種型別,但是define無法保證 具體的兩個區別如下 includ...