第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么不能在C中將'char **'轉(zhuǎn)換為'const char * const *'?

為什么不能在C中將'char **'轉(zhuǎn)換為'const char * const *'?

C
絕地?zé)o雙 2019-10-19 14:42:49
以下代碼段(正確)在C中給出了警告,并在C ++中給出了錯(cuò)誤(分別使用經(jīng)版本3.4.5和4.2.1測(cè)試的gcc和g ++; MSVC似乎無(wú)關(guān)緊要):char **a;const char** b = a;我可以理解并接受。C ++解決此問題的方法是將b更改為const char * const *,這不允許重新分配指針并阻止您規(guī)避const正確性(C ++ FAQ)。char **a;const char* const* b = a;但是,在純C語(yǔ)言中,更正后的版本(使用const char * const *)仍然發(fā)出警告,我不明白為什么。有沒有一種方法可以解決這個(gè)問題而無(wú)需使用演員表?要澄清:1)為什么這會(huì)在C語(yǔ)言中生成警告?它應(yīng)該完全是const安全的,C ++編譯器似乎也是如此。2)在說(shuō)(并讓編譯器強(qiáng)制執(zhí)行)我不會(huì)修改其指向的字符時(shí)接受此char **作為參數(shù)的正確方法是什么?例如,如果我想編寫一個(gè)函數(shù):void f(const char* const* in) {  // Only reads the data from in, does not write to it}我想在char **上調(diào)用它,參數(shù)的正確類型是什么?
查看完整描述

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è)問題。


查看完整回答
反對(duì) 回復(fù) 2019-10-19
?
藍(lán)山帝景

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 ++中除外)。


查看完整回答
反對(duì) 回復(fù) 2019-10-19
?
白豬掌柜的

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ì)此源代碼行禁用編譯器警告。


查看完整回答
反對(duì) 回復(fù) 2019-10-19
  • 3 回答
  • 0 關(guān)注
  • 1601 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)