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


在C++11中有明確規定

char* p = "abc"; // valid in C, invalid in C++
1
如果你進行了這樣的賦值,那么編譯器就會跳出諸如標題的警告。但是如果你改成下面這樣就會通過warning

char* p = (char*)"abc"; //OK
1
或者這樣:

char const *p="abc";//OK
1
 這到底是怎么一回事呢?事實上,我們在學習c或者c++的時候都知道,如果在賦值操作的時候,等號兩邊的變量類型不一樣,那么編譯器會進行一種叫做 implicit conversion 的操作來使得變量可以被賦值。

 在我們上面的表達式中就存在這樣的一個問題,等號右邊的"abc"是一個不變常量,在c++中叫做string literal,type是const char *,而p則是一個char指針。如果強行賦值會發生什么呢?沒錯,就是將右邊的常量強制類型轉換成一個指針,結果就是我們在修改一個const常量。編譯運行的結果會因編譯器和操作系統共同決定,有的編譯器會通過,有的會拋異常,就算過了也可能因為操作系統的敏感性而被殺掉。

 像這種直接將string literal 賦值給指針的操作被開發者們認為是deprecated,只不過由於以前很多代碼都有這種習慣,為了兼容,就保留下來了。

原文鏈接:https://blog.csdn.net/VVVLeHr/article/details/86697346


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM