typedef
一,定義
typedef:聲明自訂資料類型,配合各種原有資料類型,用來簡化編程。
二,用途
1,便於移植
typedef int INT32;
INT32 a;//定義整型變數
(INT32) a;//強制轉換類型
為什麼有int 還要取同名 INT32 ?
答:A微處理器 int 16位,long 32位
B微處理器 short 16位,int 32位,long 64位
原本A處理器下程式:
typedef int INT16;
typedef long INT32;
要移植到B處理器下,則僅僅需要更改這些新名稱就行,而不用更改整個程式。
typedef short INT16;
typedef int INT32;
2,在舊的C代碼中,協助struct。
由於在舊的C代碼中,聲明struct對象時,必須帶上struct 。
如:struct node
{
int data;
struct node next; //C語言中必須帶上 struct ;而在C++中則可以省略struct
} ;
而寫成
typedef struct node
{
int data;
}node_re;
node_re root;
3,定義已有類型的一種別名
typedef char *pchar;
pchar pa,pb;
為指標聲明typedef 時,容易出現問題。所以建議:只要為指標聲明 typedef,那麼都要在最終的 typedef 名稱中加一個 const,以使得該指標本身所指對象不會通過指標被修改。
typedef const char *pchar;
define
一,定義:定義宏,即允許用一個標示符來表示一個字串。
二,用處:
1,方便程式修改
定義程式中經常使用的常量,這樣在常量改變時,不用對整個程式進行修改。
例如:#define pi 3.141592653 //不用每次都輸入3.141592653 直接輸入 pi
2,提高程式運行效率
C語言中,函數的使用可以使程式更加模組化,便於組織,而且可以重複利用。
但是,函數調用時,需要保留調用函數的現場,便於子函數執行結束後能返回繼續執行。在子函數執行完後要恢複調用函數的現場,這需要一定時間。
如果子函數執行操作較多,這種轉換時間可以忽略。但是如果執行功能較少,則開銷相對較大。
例如:#define S(a,b) a*b //僅僅是一條乘法 操作
define與typedef的區別
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;表示定義了一個整型指標,一個整型變數
http://blog.csdn.net/tianshuai11/article/details/7036136