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是指...