3 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
注意
typedef int* intptr;
const intptr x;
與以下內(nèi)容不同:
const int* x;
intptr是指向int的指針。const intptr是指向常量的指針int,而不是指向常量的指針int。
所以,在typedef指針之后,我不能再將其常量化為內(nèi)容了嗎?
有一些丑陋的方法,例如gcc的typeof宏:
typedef int* intptr;
intptr dummy;
const typeof(*dummy) *x;
但是,如您所見,知道后面的類型是沒有意義的intptr。

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
雖然以上答案已經(jīng)解決了問題,但我確實(shí)想念為什么...
因此,也許是一個(gè)經(jīng)驗(yàn)法則:
將const總是指它的前身令牌。
如果沒有這種情況,它是“ consting”它是后繼令牌。
該規(guī)則確實(shí)可以幫助您聲明一個(gè)指向const指針的指針或類似的東西。
無論如何,考慮到這一點(diǎn),應(yīng)該弄清楚為什么
struct Person *const person = NULL;
聲明一個(gè)指向可變結(jié)構(gòu)的const指針。
考慮一下,您的typedef 使用指針標(biāo)記將“分組”。所以,寫struct Person*
const PersonRef person = NULL;
您的編譯器會(huì)看到以下內(nèi)容(偽代碼):
const [struct Person *]person = NULL;
由于的內(nèi)容已不const剩,因此它將令牌標(biāo)記為正確的struct Person *常量。
好吧,我認(rèn)為,這就是為什么我不喜歡使用typedef隱藏指針的原因,而我確實(shí)喜歡typedef。那寫作呢
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
對(duì)于編譯器和人員來說,您應(yīng)該做什么很清楚。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
永遠(yuǎn)不要將指針隱藏在typedef后面,這確實(shí)是一種糟糕的做法,只會(huì)造成bug。
此類臭名昭著的錯(cuò)誤是,聲明為const的typedef:ed指針類型將被視為“指向非常量數(shù)據(jù)的常量指針”,而不是“直觀地希望指向常量數(shù)據(jù)的非常量指針”。 。這就是程序中發(fā)生的情況。
解:
typedef struct
{
int age;
} Person;
const Person* person = NULL; // non-constant pointer to constant Person
- 3 回答
- 0 關(guān)注
- 521 瀏覽
添加回答
舉報(bào)