define和typedef的區別
時間:2018-09-29 來源:未知
今天在用到typedef時,突然想到define好像也可以實現重定義的功能,就在想那這兩者之間有什么區別,又有什么聯系呢?所以整理出了下面的文檔供大家參考,總結有疑問的地方,可以提出來一塊討論。
1.define:
#define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程序時才會發現可能的錯誤并報錯。
通常用它來定義常量(包括無參量與帶參量),以及用來實現那些“表面似和善、背后一長串”的宏,它本身并不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了,但也因此難以發現潛在的錯誤及其它代碼維護問題
#define定義“可讀”的常量以及一些宏語句的任務
2.typedef:
typedef是在編譯時處理的。它在自己的作用域內給一個已經存在的類型一個別名,但是You cannot use the typedef specifier inside a function definition。
typedef常用來定義一個標識符及關鍵字的別名,它是語言編譯過程的一部分,但它并不實際分配內存空間
typedef則常用來定義關鍵字、冗長的類型的別 名
3.區別1:
typedef int * int_ptr;
#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是采用如同定義變量的方法那樣來聲明一種類型。也就是說;
#define int_ptr int *
int_ptr a, b; // 相當于int * a, b; 只是簡單的宏替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指針,typedef為int* 引入了一個新的助記符
4.區別2:
typedef int * pint ;
#define PINT int *
那么:
const pint p ;//p不可更改,但p指向的內容可更改
const PINT p ;//p可更改,但是p指向的內容不可更改。
pint是一種指針類型 const pint p 就是把指針給鎖住了 p不可更改
而const PINT p 是const int * p 鎖的是指針p所指的對象。

