typedef和define區別(通俗)

2021-10-05 04:43:46 字數 1628 閱讀 1170

總結: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...