typedef是在計(jì)算機(jī)編程語(yǔ)言中用來(lái)為復(fù)雜的聲明定義簡(jiǎn)單的別名,與宏定義有些差異。它本身是一種存儲(chǔ)類(lèi)的關(guān)鍵字,與auto、extern、mutable、static、register等關(guān)鍵字不能出現(xiàn)在同一個(gè)表達(dá)式中。
typedef為C語(yǔ)言的關(guān)鍵字,作用是為一種數(shù)據(jù)類(lèi)型定義一個(gè)新名字。這里的數(shù)據(jù)類(lèi)型包括內(nèi)部數(shù)據(jù)類(lèi)型(int,char等)和自定義的數(shù)據(jù)類(lèi)型(struct等)。
在編程中使用typedef目的一般有兩個(gè),一個(gè)是給變量一個(gè)易記且意義明確的新名字,另一個(gè)是簡(jiǎn)化一些比較復(fù)雜的類(lèi)型聲明。

define,無(wú)參宏定義的一般形式為:#define 標(biāo)識(shí)符 字符串define 函數(shù)定義一個(gè)常量。常量類(lèi)似變量,不同之處在于:在設(shè)定以后,常量的值無(wú)法更改。常量名不需要開(kāi)頭的美元符號(hào) ($)。作用域不影響對(duì)常量的訪問(wèn) 。常量值只能是字符串或數(shù)字。
被定義為“宏”的標(biāo)識(shí)符稱為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開(kāi)”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動(dòng)完成的。
宏定義的作用范圍僅限于當(dāng)前文件,即file1.c中定義 #define PI 3.14,在file2.c中該宏定義不起作用;通過(guò)將#define PI 3.14定義在common.h中,file1.c和file2.c分別#include “common.h”的方式,該宏定義在file1.c和file2.c中都起作用。在C或C++語(yǔ)言中,“宏”分為有參數(shù)和無(wú)參數(shù)兩種。

typedef和define區(qū)別
1) #define是預(yù)處理指令,在編譯預(yù)處理時(shí)進(jìn)行簡(jiǎn)單的替換,不作正確性檢查,不關(guān)含義是否正確照樣帶入,只有在編譯已被展開(kāi)的源程序時(shí)才會(huì)發(fā)現(xiàn)可能的錯(cuò)誤并報(bào)錯(cuò)。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 會(huì)替換為3.1415926*r*r
如果你把#define語(yǔ)句中的數(shù)字9 寫(xiě)成字母g 預(yù)處理也照樣帶入。
2)typedef是在編譯時(shí)處理的。它在自己的作用域內(nèi)給一個(gè)已經(jīng)存在的類(lèi)型一個(gè)別名,但是You cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr;
與
#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說(shuō) ,#define在預(yù)處理 時(shí)進(jìn)行簡(jiǎn)單的替換,而typedef不是簡(jiǎn)單替換 ,而是采用如同定義變量的方法那樣來(lái)聲明一種類(lèi)型。也就是說(shuō);
//refer to (xzgyb(老達(dá)摩))
#define int_ptr int *
int_ptr a, b; //相當(dāng)于int * a, b; 只是簡(jiǎn)單的宏替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指針,typedef為int* 引入了一個(gè)新的助記符
這也說(shuō)明了為什么下面觀點(diǎn)成立
//QunKangLi(維護(hù)成本與程序員的創(chuàng)造力的平方成正比)
typedef int * pint ;
#define PINT int *
那么:
const pint p ;//p不可更改,但p指向的內(nèi)容可更改
const PINT p ;//p可更改,但是p指向的內(nèi)容不可更改。
pint是一種指針類(lèi)型 const pint p 就是把指針給鎖住了 p不可更改
而const PINT p 是const int * p 鎖的是指針p所指的對(duì)象。
3)也許您已經(jīng)注意到#define 不是語(yǔ)句 不要在行末加分號(hào),否則 會(huì)連分號(hào)一塊置換。
另轉(zhuǎn)一篇
一、typedef的用法
在C/C++語(yǔ)言中,typedef常用來(lái)定義一個(gè)標(biāo)識(shí)符及關(guān)鍵字的別名,它是語(yǔ)言編譯過(guò)程的一部分,但它并不實(shí)際分配內(nèi)存空間,實(shí)例像:
typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
typedef可以增強(qiáng)程序的可讀性,以及標(biāo)識(shí)符的靈活性,但它也有“非直觀性”等缺點(diǎn)。
二、#define的用法
#define為一宏定義語(yǔ)句,通常用它來(lái)定義常量(包括無(wú)參量與帶參量),以及用來(lái)實(shí)現(xiàn)那些“表面似和善、背后一長(zhǎng)串”的宏,它本身并不在編譯過(guò)程中進(jìn)行,而是在這之前(預(yù)處理過(guò)程)就已經(jīng)完成了,但也因此難以發(fā)現(xiàn)潛在的錯(cuò)誤及其它代碼維護(hù)問(wèn)題,它的實(shí)例像:
#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++一書(shū)的條款1中有關(guān)于#define語(yǔ)句弊端的分析,以及好的替代方法,大家可參看。
三、#typedef與#define的區(qū)別
從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為標(biāo)識(shí)符另起的新名稱(僅僅只是個(gè)別名),而#define原本在C中是為了定義常量, 到了C++,const、enum、inline的出現(xiàn)使它也漸漸成為了起別名的工具。有時(shí)很容易搞不清楚與typedef兩者到底該用哪個(gè)好,如 #define INT int這樣的語(yǔ)句,用typedef一樣可以完成,用哪個(gè)好呢?我主張用typedef,因?yàn)樵谠缙诘脑S多C編譯器中這條語(yǔ)句是非法的,只是現(xiàn)今的編譯器 又做了擴(kuò)充。為了盡可能地兼容,一般都遵循#define定義“可讀”的常量以及一些宏語(yǔ)句的任務(wù),而typedef則常用來(lái)定義關(guān)鍵字、冗長(zhǎng)的類(lèi)型的別 名。
宏定義只是簡(jiǎn)單的字符串代換(原地?cái)U(kuò)展),而typedef則不是原地?cái)U(kuò)展,它的新名字具有一定的封裝性,以致于新命名的標(biāo)識(shí)符具有更易定義變量的功能。請(qǐng)看上面第一大點(diǎn)代碼的第三行:
typedef (int*) pINT;以及下面這行:#define pINT2 int*
效果相同?實(shí)則不同!實(shí)踐中見(jiàn)差別:pINT a,b;的效果同int *a; int *b;表示定義了兩個(gè)整型指針變量。而pINT2 a,b;的效果同int *a, b;表示定義了一個(gè)整型指針變量a和整型變量b。
電子發(fā)燒友App














評(píng)論