Typedef和 define的區別

2021-08-28 08:15:53 字數 4687 閱讀 4471

typedef

本身是一種儲存類的關鍵字,在計算機程式語言中用來為複雜的宣告定義簡單的別名。

typedef 的含義:

找到你所要宣告的通用格式。例如這裡申明 inta[4],b[4],c[4],只有a,b,c不同,但是他們有相同的申明模式 int《名字》[4];

用你想要申明的新型別名代替通用格式中的變化部分。例如這裡就是用新型別int_array代替a,b,c所在的位置,再在前面加上typedef符號

以後你想申明處在上面int_array位置的a,b,c型別時,就可以用:int_array a,b,c;

所以在程式中,可能需要為某些整數定義乙個別名,我們就可以利用預處理指令#define來完成。

用途

用途一:

定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如:

char* pa, pb; // 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,

// 和乙個字元變數;

以下則可行:

typedef char* pchar; // 一般用大寫

pchar pa, pb; // 可行,同時宣告了兩個指向字元變數的指標

雖然:char *pa, *pb;

也可行,但相對來說沒有用typedef的形式直觀,尤其在需要大量指標的地方,typedef的方式更省事。

用途二:

用在舊的c的**中(具體多舊沒有查),幫助struct。以前的**中,宣告struct新物件時,必須要帶上struct,即形式為: struct 結構名 物件名,如:

[cpp] view plain copystruct tagpoint1

;struct tagpoint1 p1;

而在c++中,則可以直接寫:結構名 物件名,即:

tagpoint1 p1;

估計某人覺得經常多寫乙個struct太麻煩了,於是就發明了:

[cpp] view plain copytypedef struct tagpoint

point;

point p1; // 這樣就比原來的方式少寫了乙個struct,比較省事,尤其在大量使用的時候

或許,在c++中,typedef的這種用途二不是很大,但是理解了它,對掌握以前的舊**還是有幫助的,畢竟我們在專案中有可能會遇到較早些年代遺留下來的**。

用途三:

用typedef來定義與平台無關的型別。

比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為:

typedef long double real;

在不支援 long double 的平台二上,改為:

typedef double real;

在連 double 都不支援的平台三上,改為:

typedef float real;

也就是說,當跨平台時,只要改下 typedef 本身就行,不用對其他原始碼做任何修改。

標準庫就廣泛使用了這個技巧,比如size_t。

另外,因為typedef是定義了一種型別的新別名,不是簡單的字串替換,所以它比巨集來得穩健(雖然用巨集有時也可以完成以上的用途)。

用途四:

為複雜的宣告定義乙個新的簡單的別名。方法是:在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。舉例:

1. 原宣告:int *(*a[5])(int, char*);

變數名為a,直接用乙個新別名pfun替換a就可以了:

typedef int *(*pfun)(int, char*);

原宣告的最簡化版:

pfun a[5];

2. 原宣告:void (*b[10]) (void (*)());

變數名為b,先替換右邊部分括號裡的,pfunparam為別名一:

typedef void (*pfunparam)();

再替換左邊的變數b,pfunx為別名二:

typedef void (*pfunx)(pfunparam);

巨集定義:

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集

」。格式: 1.

#define

識別符號字串

其中的識別符號就是所謂的符號常量,也稱為「巨集名

」。例如:

#definepi3.1415926

就是把程式中出現的

pi全部換成

3.1415926 2.

除了一般的字串替換,還要做引數代換

格式:#define

巨集名(參數列

)字串

例如:#defines(a,b)a*b

area=s(3,2);

第一步被換為

area=a*b;

,第二步被換為

area=3*2;

類似於函式呼叫

簡單的巨集定義有如下格式:

[#define

指令(簡單的巨集)

]  #define

識別符號替換列表

當預處理器遇到乙個

巨集定義時,會做乙個「識別符號」代表「替換列表」的記錄,在檔案後面的內容中,不管識別符號在任何位置出現,預處理器都會用替換列表代替它。

簡單的巨集主要用來定義

明示常量的東西,使用巨集,我們可以給數值,字元,和字串命名。

#define ste_len   80

#define true   1

#define false   0

#define pi    3.14159

#define cr    『\r』

#define  eos   『\0』

typedef和巨集定義的區別:

define是一種智慧型替換,而typedef是告訴編譯器,為這個型別取了乙個別名,而不是像巨集一樣是一種文字替換了。

使用define:

#define mytype int*

mytype a,b; //此時出現差異,a為指向int的指標變數,而b為int變數

使用typedef:

typedef int *mytype;

mytype a,b; //a,b均為指向int 的指標變數

由此可見,當我們在函式中,需要連續宣告多個像這種指標變數時,則應該使用typedef,用typedef定義的型別能夠保證宣告中所有的變數均為同一型別。

還有在 const關鍵字修飾下也不同:

n=2;

const mytype a;

a=&n;

//這時候就出現錯誤了,因為const 修飾的是int,此時a是乙個指向常量的指標;

const mytype b=n;

//此時const修飾的是int*,b是乙個常指標;

typedef和#define的用法與區別   

typedef的用法   

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

例項像:   

typedef int int;   

typedef int array[10];   

typedef (int*) pint;   

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

2、#define的用法   

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

它的例項像:   

#define int int   

#define true 1   

#define add(a,b) ((a)+(b));   

#define loop_10 for (int i=0; i<10;i++)

3、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。

Typedef和define的區別

typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。1 首先,二者執行時間不同 關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何...

typedef和 define的區別

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

typedef和define的區別

define char string string filename 這段 是可以工作的那麼為什麼還要多個typedef呢?請看下面 利用上面的 如果這樣寫 string file1,file2 經過替換,變成 char file1,file2 雖然在編譯上不錯但是含義卻錯了,裡面的 file1是指...