3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(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;
但是,如您所見(jiàn),知道后面的類(lèi)型是沒(méi)有意義的intptr。

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
雖然以上答案已經(jīng)解決了問(wèn)題,但我確實(shí)想念為什么...
因此,也許是一個(gè)經(jīng)驗(yàn)法則:
將const總是指它的前身令牌。
如果沒(méi)有這種情況,它是“ consting”它是后繼令牌。
該規(guī)則確實(shí)可以幫助您聲明一個(gè)指向const指針的指針或類(lèi)似的東西。
無(wú)論如何,考慮到這一點(diǎn),應(yīng)該弄清楚為什么
struct Person *const person = NULL;
聲明一個(gè)指向可變結(jié)構(gòu)的const指針。
考慮一下,您的typedef 使用指針標(biāo)記將“分組”。所以,寫(xiě)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。那寫(xiě)作呢
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
對(duì)于編譯器和人員來(lái)說(shuō),您應(yīng)該做什么很清楚。

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