由Typedef引發的問題

2021-05-02 04:30:33 字數 1666 閱讀 7891

typedef

引發的問題

**自:

用來宣告乙個別名,

typedef

後面的語法,是乙個宣告。本來筆者以為這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。

在這些教材中介紹

typedef

的時候通常會寫出如下形式:

typedef int para;

這種形式跟

#define int para

幾乎一樣,如前面幾章所述,這些教材的宗旨是由淺入深,但實際做出來的行為卻是以偏蓋全。

的確,這種形式在所有形式中是最簡單的,但卻沒有對

typedef

進一步解釋,使得不少人用

#define

的思維來看待

typedef

,把int

與para

分開來看,

int是一部分,

para

是另一部分,但實際上根本就不是這麼一回事。int

para

是乙個整體!就象int i:

宣告一樣是乙個整體宣告,只不過int i

定義了乙個變數,而typedef

定義了乙個別名。這些人由於持有這種錯誤的觀念,就會無法理解如下一些宣告:

typedef int a[10]; typedef void (*p)(void);

他們會以為

a[10]

是int

的別名,

(*p)(void)

是void

的別名,但這樣的別名看起來又似乎不是合法的名字,於是陷入困惑之中。實際上,上面的語句把

a宣告為具有10個

int元素的陣列的型別別名,

p是一種函式指標的型別別名。

雖然在功能上,

typedef

可以看作乙個跟

int para

分離的動作,但語法上typedef

屬於儲存類宣告說明符,因此嚴格來說,typedef int para

整個是乙個完整的宣告。

定義乙個函式指標型別。比如原函式是

void func(void);

那麼定義的函式指標型別就是

typedef void (*fun)(void);

然後用此型別生成乙個指向函式的指標:

fun func1;

當func1

獲取函式位址之後,那麼你就可以向呼叫原函式那樣來使用這個函式指標:

func1(void);

由乙個typedef問題引發的思考

同樣,可以像下面這樣隱藏指標語法 typedef char pstr intmystrcmp const pstr p1,const pstr p3 用gnu的gcc和g 編譯器,是會出現警告的,按照順序,const pstr 被解釋為 char const 乙個指向char的指標常量 而事實上,c...

由const引發的版本控制問題

最近,對專案的庫做了一次公升級,程式一切正常。但是,有次開啟 oracle 發現資料不對,表中還是沒有公升級之前的老資料。於是,對所有庫做了一次徹底檢查,硬是沒找出 bug。心裡想,先放著吧,說不定就來靈感了呢!幾天後,我偶然把專案全部 compiler 一次,資料竟然正常了。怪,怪了。難道是常量的...

由object不能比較引發的問題

這是乙個小問題,請看下面的 using system using system.collections.generic using system.linq using system.text namespace sample 我們假設有兩個變數,其實它們是int,但程式用object來接收它們。然後...