#define VS
typedef
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
。例如:
typedef
int INT;
typedef int
ARRAY[10];
typedef (int*) pINT;
typedef
可以增強程式的可讀性,以及標識符的靈活性,但它也有
“
非直觀性
”
等缺點。
3.
typedef
與
#define
的區別
從以上的概念便也能基本清楚,
typedef
只是為了增加可讀性而為標識符另起的新名稱
(
僅僅只是個別名
)
,而
#define
原本在
C
中是為了定義常量,到
了
C++
,
const
、
enum
、
inline
的出現使它也漸漸成為了起別名的工具。有時很容易搞不清楚與
typedef
兩者到底該用哪個好,如
#define INT int
這樣的語句,用
typedef
一樣可以完成,用哪個好呢?我主張用
typedef
,因為在早期的許多
C
編譯器中這條語句是非法的,只是現今的編譯器又做了擴充。為了儘可能地相容,一般都遵循
#define
定義
“
可讀
”
的常量以及一些宏語句的任務,而
typedef
則常用來定義關鍵字、冗長的類型的別名。
宏定義只是簡單的字串代換(原地擴充),而
typedef
則不是原地擴充,它的新名字具有一定的封裝性,以致於新命名的標識符具有更易定義變數的功能。
樣本
1
:
typedef
(int*) pINT;
#define
pINT2 int*
效果相同?實則不同!實踐中見差別:
pINT a,b;
的效果同
int *a; int *b;
表示定義了兩個整型指標變數。而
pINT2 a,b;
的效果同
int *a, b;
表示定義了一個整型指標變數
a
和整型變數
b
。
樣本
2
:
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
所指的對象。
4.
#define
不是語句不要在行末加分號,否則會連分號一塊置換。