3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
幾年前,我遇到了同樣的問題,這讓我無(wú)休止。
用C表示的規(guī)則更簡(jiǎn)單(即,它們不列出諸如轉(zhuǎn)換char**為的異常const char*const*)。因此,這是不允許的。在C ++標(biāo)準(zhǔn)中,它們包括更多的規(guī)則以允許這樣的情況。
最后,這只是C標(biāo)準(zhǔn)中的問題。我希望下一個(gè)標(biāo)準(zhǔn)(或技術(shù)報(bào)告)能解決這個(gè)問題。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
為了被認(rèn)為是兼容的,源指針應(yīng)該在前向間接級(jí)別中為const。因此,這將在GCC中向您發(fā)出警告:
char **a;
const char* const* b = a;
但這不會(huì):
const char **a;
const char* const* b = a;
另外,您可以強(qiáng)制轉(zhuǎn)換:
char **a;
const char* const* b = (const char **)a;
您將需要使用相同的強(qiáng)制轉(zhuǎn)換來(lái)調(diào)用函數(shù)f()。據(jù)我所知,在這種情況下無(wú)法進(jìn)行隱式轉(zhuǎn)換(C ++中除外)。

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
但是,在純C語(yǔ)言中,這仍然會(huì)發(fā)出警告,我不明白為什么
您已經(jīng)確定了問題-此代碼不是const正確的?!罢_的常量”意味著,除了const_castC樣式強(qiáng)制轉(zhuǎn)換刪除之外const,您永遠(yuǎn)const不能通過(guò)這些常量指針或引用來(lái)修改對(duì)象。
const-correctness 的值const在很大程度上用于檢測(cè)程序員錯(cuò)誤。如果您將聲明為const,則表示您不應(yīng)該對(duì)其進(jìn)行修改,或者至少,const只有那些有權(quán)使用該版本的人才不能對(duì)其進(jìn)行修改??紤]:
void foo(const int*);
如聲明的那樣,foo沒有權(quán)限修改其參數(shù)指向的整數(shù)。
如果不確定為什么發(fā)布的代碼不const正確,請(qǐng)考慮以下代碼,該代碼與HappyDude的代碼僅稍有不同:
char *y;
char **a = &y; // a points to y
const char **b = a; // now b also points to y
// const protection has been violated, because:
const char x = 42; // x must never be modified
*b = &x; // the type of *b is const char *, so set it
// with &x which is const char* ..
// .. so y is set to &x... oops;
*y = 43; // y == &x... so attempting to modify const
// variable. oops! undefined behavior!
cout << x << endl;
非const類型只能以特定方式轉(zhuǎn)換為const類型,以防止const在沒有顯式強(qiáng)制轉(zhuǎn)換的情況下對(duì)數(shù)據(jù)類型進(jìn)行任何規(guī)避。
最初聲明的對(duì)象const特別特殊-編譯器可以假定它們永不更改。但是,如果b可以在a不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下為其賦值,那么您可能會(huì)無(wú)意間嘗試修改const變量。這不僅會(huì)破壞您要求編譯器進(jìn)行的檢查,不允許您更改該變量的值,還會(huì)使您破壞編譯器的優(yōu)化!
在某些編譯器上,這將打印42,在某些編譯器上43,則該程序?qū)⒈罎ⅰ?/p>
編輯添加:
HappyDude:您的評(píng)論很對(duì)。無(wú)論是C語(yǔ)言還是正在使用的C編譯器,其處理方式const char * const *與C ++語(yǔ)言都根本不同。也許可以考慮僅對(duì)此源代碼行禁用編譯器警告。
- 3 回答
- 0 關(guān)注
- 1601 瀏覽
添加回答
舉報(bào)