2010-02-12 85 views
19

首先,樣本的代碼:C++常量指針的typedef解釋

情況1:


typedef char* CHARS; 
typedef CHARS const CPTR; // constant pointer to chars 

以文本替換煤焦變爲:


typedef char* const CPTR; // still a constant pointer to chars 

情況2:


typedef char* CHARS; 
typedef const CHARS CPTR; // constant pointer to chars 

在文本上取代CHARS變爲:


typedef const char* CPTR; // pointer to constant chars 

在情況2中,在文本替換CHARS之後,typedef的含義發生了變化。這是爲什麼? C++如何解釋這個定義?

+8

一般來說,typedef指針(隱藏星號)是一個壞主意,正因爲const不能插入指向類型和星號之間。 – Tronic 2010-02-12 17:44:04

+0

http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const/1808665的重複排序 – 2010-02-12 18:57:49

回答

33

在基於文本替換的基礎上分析typedef行爲毫無意義。 Typedef名稱不是宏,它們不會被文本替換。

正如你指出自己

typedef CHARS const CPTR; 

是一回事

typedef const CHARS CPTR; 

這是因此對於同樣的原因,

typedef const int CI; 

的含義

相同
typedef int const CI; 

Typedef-name沒有定義新類型(只有現有類型的別名),但它們是「原子的」,因爲任何限定符(如const)都適用於最高級別,即它們適用於整個整個隱藏在typedef名稱後面的類型。一旦你定義了一個typedef-name,你就不能在其中注入一個限定符,這樣它就可以修改任何更深層次的類型。

12

Typedef不是一個簡單的文本替換。

typedef const CHARS CPTR; 

表示「CPTR類型將是一個常量CHARS的東西。」但是CHARS是一個指向字符類型的指針,所以這說「CPTR類型將是一個const指向char類型的指針」。這與您做簡單替換時看到的不符。

換句話說,

typedef char * CHARS; 

一樣

#define CHARS char * 

的typedef的語法是像一個變量聲明,除了代替聲明目標名稱爲可變,它將它聲明爲一個新的類型名稱,可用於聲明該變量在沒有typedef的情況下的變量類型。

下面是搞清楚什麼typedef的聲明是一個簡單的過程:

  1. 取出typedef關鍵字。現在你將有一個變量聲明。

    const CHARS CPTR; 
    
  2. 弄清楚鍵入變量(一些編譯器有一個typeof()運營商這不正是這一點,是非常有用的)。調用該類型T.在這種情況下,指向(非常量)char的常量指針。

  3. 替換typedef。您現在正在聲明一個新類型(CPTR),它與T(一個指向(非常量)char的常量指針的類型完全相同。