warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

在C++11中有明確規定

char* p = "abc"; // valid in C, invalid in C++

如果你進行了這樣的賦值,那麼編譯器就會跳出諸如標題的警告。但是如果你改成下面這樣就會通過warning

char* p = (char*)"abc"; //OK

或者這樣:

char const *p="abc";//OK

 這到底是怎麼一回事呢?事實上,我們在學習c或者c++的時候都知道,如果在賦值操作的時候,等號兩邊的變量類型不一樣,那麼編譯器會進行一種叫做 implicit conversion 的操作來使得變量可以被賦值。
 
 在我們上面的表達式中就存在這樣的一個問題,等號右邊的"abc"是一個不變常量,在c++中叫做string literal,type是const char *,而p則是一個char指針。如果強行賦值會發生什麼呢?沒錯,就是將右邊的常量強制類型轉換成一個指針,結果就是我們在修改一個const常量。編譯運行的結果會因編譯器和操作系統共同決定,有的編譯器會通過,有的會拋異常,就算過了也可能因爲操作系統的敏感性而被殺掉。
 
 像這種直接將string literal 賦值給指針的操作被開發者們認爲是deprecated,只不過由於以前很多代碼都有這種習慣,爲了兼容,就保留下來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章