簡體   English   中英

為什么 C++ 中的字符串文字 (char*) 必須是常量?

[英]Why do string literals (char*) in C++ have to be constants?

我最近一直在學習 C++ 並意識到 C++ 中的字符串文字必須是常量,而在 C 中,它們不是。 這是一個例子。 以下代碼在 C 中有效,但在 C++ 中無效:

char* str = "Hello World";

為了在 C++ 中做同樣的事情,必須使用以下語句:

const char* str = "Hello World";

有人可以解釋為什么嗎?

稍微擴展克里斯蒂安吉本斯的答案......

在 C 中,像"Hello World"這樣的字符串文字存儲在char的 arrays 中,這樣它們在程序的生命周期內都是可見的。 字符串文字應該是不可變的,並且某些實現會將它們存儲在只讀 memory 段中(這樣嘗試修改文字的內容將觸發運行時錯誤)。 一些實現不會,並且嘗試修改文字的內容可能不會觸發運行時錯誤(它甚至可能看起來像預期的那樣工作)。 C 語言定義使行為“未定義”,以便編譯器可以自由處理它認為合適的情況。

在 C++ 中,字符串文字存儲在const char的 arrays 中,因此任何修改文字內容的嘗試都會在編譯時觸發診斷。

正如 Christian 所指出的, const關鍵字最初不是 C 的一部分。 然而,它最初是 C++ 的一部分,它使使用字符串文字更加安全。

請記住, const關鍵字並不意味着“將它存儲在只讀內存中”,它僅意味着“這個東西可能不是賦值的目標”。

還要記住,除非它是sizeof或一元*運算符的操作數,或者是用於在聲明中初始化字符數組的字符串文字,否則將轉換類型為“ T的 N 元素數組”的表達式(“decay ") 到類型為“pointer to T ”的表達式,表達式的值將是數組第一個元素的地址。

在 C++ 中,當你寫

const char *str = "Hello, world";

字符串的第一個字符的地址存儲到str 您可以將str設置為指向不同的字符串文字:

str = "Goodbye cruel world";

但你不能做的是修改字符串的內容,比如

str[0] = 'h';

或者

strcpy( str, "Something else" );

C 最初沒有const關鍵字,因此如果他們在引入關鍵字后將文字更改為需要const限定,則會破壞遺留代碼。 但是,C 的字符串文字是不可變的,因此更改內容是未定義的行為,即使它不是const限定的。

另一方面,C++ 是使用const關鍵字設計的。 最初,C++ 確實允許將字符串文字分配給非const限定的char * s,大概是為了與現有的 C 代碼兼容。 然而,從 C++03 標准開始,他們決定棄用此功能,而不是讓不和諧持續下去。 我猜想依賴指向字符串文字的非const限定char * s 的遺留 C++ 代碼的數量足夠小,這是一個值得權衡的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM