typedef 用法與陷阱

2021-06-26 21:02:51 字數 1906 閱讀 1479

首先來看乙個宣告

typedef int myfunc(const char *, const struct stat *, int);

怎麼理解吶?myfunc(const char *, const struct stat *,int) 是int,是不是有點問題。這就是對typedef的理解出了問題。

之前見到的都是typedef int int;int 是int的別名,可以int a。錯誤在於我們將typedef int int;分開來理解了。把int與int分開來看,int是一部分,int是另一部分,但實際上根本就不是這麼一回事。int與int是乙個整體!就象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;

然後:int mystrcmp(const pstr, const pstr);

const pstr實際上相當於const char*嗎?不是的,它實際上相當於char* const。

原因在於const給予了整個指標本身以常量性,也就是形成了常量指標char* const。

簡單來說,記住當const和typedef一起出現時,typedef不會是簡單的字串替換就行。

陷阱二:

typedef在語法上是乙個儲存類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它並不真正影響物件的儲存特性,如:

typedef static int int2; //不可行

編譯將失敗,會提示「指定了乙個以上的儲存類」。

typedef與#define的區別

從以上的概念便也能基本清楚,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;表示定義了乙個整型指標變數a和整型變數b。

揭秘 typedef四用途與兩陷阱

typedef用來宣告乙個別名,typedef後面的語法,是乙個宣告。本來筆者以為這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹typedef的時候通常會寫出如下形式 typedef int para 這種形式跟 define int p...

NSString 用法總結與陷阱

nsstring 用法總結與陷阱 1。如何 從 std string 轉為 nsstring 也就是 unicode 1 使用 stringwithcstring 2 使用 stringwithformat 如果是從 string 轉換為nsstring,千萬不要使用下面這樣的 要使用也使用下面的 ...

typedef 與函式指標的用法

在網上搜尋函式指標,看到乙個例子。開始沒看懂,想放棄,可是轉念一想,這個用法遲早要弄懂的,現在多花點時間看懂它,好過以後碰到了要再花一倍時間來弄懂它。其實很多時候都是這樣,如果每次到難一點的內容,總想著下次我再來解決它,那就永遠也學不到東西。後面那個例子加了注釋,是我對這種用法的理解,希望對新手有所...