C語言筆記 define與typedef的區別

2022-09-06 16:57:08 字數 1761 閱讀 4856

define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換

巨集定義的一般形式為:

#define 巨集名 字串
這裡所說的字串是一般意義上的字串行,不要和c語言中的字串等同,它不需要雙引號。

typedef是在c語言中用來為複雜的宣告定義簡單的別名,它本身是一種儲存類的關鍵字,與auto、extern、mutable、static、register等關鍵字不能出現在同乙個表示式中。

typedef取別名的一般形式為:

typedef  舊名字  新名字
(1)#define之後不帶分號,typedef之後帶分號。

(2)#define可以使用其他型別說明符對巨集型別名進行擴充套件,而 typedef 不能這樣做。如:

#define int1 int

unsigned int1 n; //沒問題

typedef int int2;

unsigned int2 n; //有問題

int1可以使用型別說明符unsigned進行擴充套件,而int2不能使用unsigned進行擴充套件。

(3)在連續定義幾個變數的時候,typedef 能夠保證定義的所有變數均為同一型別,而 #define 則無法保證。如:

#define pint1 int*;

p_int1 p1,p2; //即int *p1,p2;

typedet int* pint2;

p_int2 p1,p2; //p1、p2 型別相同

pint1定義的p1與p2型別不同,即p1為指向整形的指標變數,p2為整形變數;pint2定義的p1與p2型別相同,即都是指向 int 型別的指標。

下面看乙個關於typedef的重要的問題!!請看**:

#include typedef char *pstr;

int main(void)

這段**編譯會報乙個錯誤:error: increment of read-only variable 'p2',你知道問題出在哪嗎?

答案與解析:

是第五行**p2++出錯了。這個問題提醒我們:typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和pstr const p2本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。

因此,const pstr p2的含義是:限定資料型別為char 的變數p2為唯讀,即為char const p2,表明p2是乙個指向char型別的常指標,所以p2是不可修改的,因此p2++錯誤。

順便提一下關於const宣告的一些例子及其含義:

const int a;     //①

int const b; //②

const int *c; //③

int * const d; //④

int const * e const; //⑤

①a是常數,不可改變;

②b是常數,不可改變;

③c是乙個指向整型常數的指標,指標可以變,指標指向的內容不可以變;

④d是乙個指向整型變數的常指標,指標不可以變,指標指向的內容可以變;

⑤e是乙個指向整型常數的常指標,指標與指標指向的內容都不可變。

我的個人部落格:

C語言中巨集定義 define和關鍵字typedef

define巨集定義是字元替換,typedef是定義型別。define int int是將程式中字元為int的字元全部替換為int,在編譯預處理是進行簡單的字元替換,不做正確性檢查,不管含義是否正確,都進行替換。typedef int int是將int定義為int型的字元型別,是採取像定義變數的方法...

define用法,C語言 define詳解

c語言中,可以用 define 定義乙個識別符號來表示乙個常量。其特點是 定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。用 define 定義識別符號的一般形式為 define ...

C語言typedef與 define的辨析

typedef 1 使用它來為型別取乙個新的名字 2 也可以使用 typedef 來為使用者自定義的資料型別取乙個新的名字 define 定義巨集,define 是 c 指令,用於為各種資料型別定義別名,與 typedef 類似。但是它們有以下幾點不同 typedef 僅限於為型別定義符號名稱,de...