當前位置:才華齋>計算機>C語言>

typede和define區別

C語言 閱讀(1.31W)

C語言的應用範圍廣泛,具備很強的資料處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫,具體應用比如微控制器以及嵌入式系統開發。以下是小編為大家搜尋整理的typede和define區別,希望能給大家帶來幫助!更多精彩內容請持續關注我們應屆畢業生考試網!

typede和define區別

1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如:

#define PI 3.1415926

程式中的:area=PI*r*r 會替換為3.1415926*r*r

如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。

2)typedef是在編譯時處理的。它在自己的作用域內給一個已經存在的型別一個別名,但是You cannot use the typedef specifier inside a function definition。

3)typedef int * int_ptr;

#define int_ptr int *

作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變數的方法那樣來宣告一種型別。也就是說;

//refer to (xzgyb(老達摩))

#define int_ptr int *

int_ptr a, b; //相當於int * a, b; 只是簡單的巨集替換

typedef int* int_ptr;

int_ptr a, b; //a, b 都為指向int的指標,typedef為int* 引入了一個新的助記符

這也說明了為什麼下面觀點成立

//QunKangLi(維護成本與程式設計師的創造力的平方成正比)

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所指的物件。

3)也許您已經注意到#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。

另轉一篇

  一、typedef的用法

在C/C++語言中,typedef常用來定義一個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像:

typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT;

typedef可以增強程式的可讀性,以及識別符號的靈活性,但它也有“非直觀性”等缺點。

  二、#define的用法

#define為一巨集定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實現那些“表面似和善、背後一長串”的巨集,它本身並不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了,但也因此難以發現潛在的錯誤及其它程式碼維護問題,它的例項像:

#define INT int#define TRUE 1#define Add(a,b) ((a)+(b));#define Loop_10 for (int i=0; i<10; i++)

在Scott Meyer的Effective C++一書的條款1中有關於#define語句弊端的分析,以及好的替代方法,大家可參看。

  三、#typedef與#define的區別

從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為識別符號另起的新名稱(僅僅只是個別名),而#define原本在C中是為了定義常量, 到了C++,const、enum、inline的出現使它也漸漸成為了起別名的工具。有時很容易搞不清楚與typedef兩者到底該用哪個好,如 #define INT int這樣的語句,用typedef一樣可以完成,用哪個好呢?我主張用typedef,因為在早期的許多C編譯器中這條語句是非法的,只是現今的編譯器 又做了擴充。為了儘可能地相容,一般都遵循#define定義“可讀”的常量以及一些巨集語句的任務,而typedef則常用來定義關鍵字、冗長的型別的別 名。

巨集定義只是簡單的字串代換(原地擴充套件),而typedef則不是原地擴充套件,它的新名字具有一定的封裝性,以致於新命名的識別符號具有更易定義變數的功能。請看上面第一大點程式碼的第三行:

typedef (int*) pINT;以及下面這行:#define pINT2 int*

效果相同?實則不同!實踐中見差別:pINT a,b;的效果同int *a; int *b;表示定義了兩個整型指標變數。而pINT2 a,b;的效果同int *a, b;表示定義了一個整型指標變數a和整型變數b。

注意:兩者還有一個行尾;號的區別哦!