2013-04-28 29 views
0
typedef int* ptr_t; 
int target; 
const ptr_t a = ⌖ 
*a = 6;   //OK 
a = &target;  //<- error: assignment of read-only variable ‘a’ 

顯然,指針是常量,而不是指向的值。相反,如果使用#define。typedef-ed指針如何工作

對typedef中聲明的指針應用修飾符的規則是什麼?

對於一個實際的例子,考慮代碼 void (**foo)(void);

  • 一個如何去的typedef-ING一個類型,有資格頂級指針爲const(例如,指向一個硬件的位置),下一個指針是揮發性的(例如,可以由獨立硬件修改)指向函數的指針?

  • typedef void (**foo)(void)如果這是我們必須處理的固定聲明,那麼請在源代碼中執行上述操作?

回答

3

C標準的第6.7.5.1節描述了區別。它給作爲一個例子:

const int *ptr_to_constant; 
int *const constant_ptr; 

,並說:

任何對象的內容,將ptr_to_constant不得 通過該指針修改,但ptr_to_constant本身可以 更改爲指向另一個對象。同樣,constant_ptr指向的int 的內容可能會被修改,但constant_ptr本身 應始終指向相同的位置。

最後,該部分的第4點描述了使用typedefs。

恆定指針constant_ptr的聲明可通過包括用於類型「‘指針爲int’」的定義加以澄清 。

typedef int *int_ptr; 
    const int_ptr constant_ptr; 

聲明constant_ptr作爲具有鍵入「‘const限定 指針爲int’」中的對象。

3

的規則是:

  • typedef是不是純文本替換像宏。
  • 聲明不會被解析,看看有參與的typedef
  • CV預選賽適用於你用typedef即創建的同義詞指針:int *

所以,

typedef int* ptr_t; 
const ptr_t a = &target; 

不一樣:

const int* a; 

卻是一樣的:

int *const a; 

以文字記述,首先聲明一個const常量指針爲int,而不是像第二個那樣指向常量int。

正如您剛剛從你的例子注意到,
這是一個不好的做法,typedef指針,因爲它降低了代碼的可讀性和直觀性。它很容易在使用typedef指針時創建錯誤。最好避免它。