2009-10-19 82 views

回答

25

在存儲持續時間:

2.13.4 普通字符串和UTF-8字符串文字也稱爲窄字符串文字。窄 字符串文字的類型是,其中n是如下面所定義的字符串的大小「N常量字符的數組」,並且具有 靜態存儲持續時間

結合3.7.1

3.7.1。

所有沒有動態存儲持續時間的對象,沒有線程存儲持續時間,並且不是本地的有靜態存儲持續時間。這些對象的存儲將在 程序(3.6.2,3.6.3)期間持續。

在類型:

附件C

子條款2.13.4:

變化:字符串文本由常量 類型的字符串的文字是從「char數組」改爲「const char數組」。01的類型char16_t字符串文字從「某些整數類型的數組」更改爲「數組const char16_t」。char32_t字符串文字的 類型從「某個整數類型的數組」更改爲「數組的const char32_ - t。wchar_t的數組」的類型廣泛的字符串文字的從‘’到‘常量爲wchar_t數組’

理由:這就避免了調用一個不適當的重載函數,它可能希望能夠 修改其論據。

對原始特徵的影響:更改爲明確定義的特徵的語義。 轉換難度:簡單的句法轉換,因爲字符串文字可以轉換爲 char *; (4.2)。最常見的情況是由一個新的但不推薦的標準轉換處理: char * p =「abc」; // C中有效,在C++中不推薦使用 char * q = expr? 「abc」:「de」;用C //有效,在C++

無效如何廣泛應用於:程序,有正當理由將字符串文字作爲指針指向潛在 修改內存可能是罕見的。

動態分配(詞「堆」永遠不會在AFAIK標準的內存區域的環境中使用)的內存需要一個函數調用,可以早main許多靜態存儲器分配後發生。

+0

+1正確的答案,但您的標準報價不準確(至少2.13.4)。 – 2009-10-19 17:04:25

+0

有關C-Strings標準用法的引用也可能有用。在C世界中,返回被動態分配並因此被釋放的char *指針更爲標準。如果你不遵循這個約定,那麼你的代碼將不適合現有的採用這種約定的庫。 – 2009-10-19 18:22:22

+1

@Kirill V. Lyadvinsky:這是來自C++ 0x草案N-4411(在我的評論中提到)。 – dirkgently 2009-10-20 06:44:39

13

此代碼完全有效且符合規範。唯一的「難題」是確保調用者不嘗試釋放字符串。

+0

「此代碼完全有效且符合要求。」爲什麼? – 2009-10-19 14:28:48

+0

沒有必要。文字是'const char []',它們從不分配堆。返回的指針在整個程序執行過程中都是有效的。 – 2009-10-19 14:29:02

+1

沒有「'const char []'」 – 2009-10-19 14:30:41

11

此代碼有效且符合標準。

字符串文字存儲在只讀存儲器中,該函數只是獲取所選字符串的地址。

C++標準(2.13.4)說:

一個普通的字符串字面量的類型是 「正爲const char陣列」和靜態 存儲時間

他們關鍵要了解你的問題這裏是靜態存儲持續時間:字符串文字在程序啓動時分配,並在程序執行期間持續。你的函數只是獲取地址並返回它。

5

從技術上說它是有效的。
該字符串有靜態存儲durataion。

但這不是全部故事。

這些是C-Strings。 C庫和函數中的約定是返回一個應該釋放的動態分配的字符串。即一個返回的指針隱式地將所有權傳回給調用者(正如C中的例子也有例外)。

如果你不遵循這些約定,你會混淆很多有經驗的C開發人員,會期待這個約定。如果你不遵循這個標準的期望,那麼它應該在代碼中有充分的記錄。

此外這是C++(根據您的標籤)。所以更傳統的是返回一個std :: string。原因是隻通過指針傳遞所有權(這導致了C代碼中的很多錯誤,因爲上面的期望被破壞但記錄在案,不幸的是文檔沒有被代碼的用戶讀過)。通過使用一個std :: string你傳遞一個對象,它們不再是所有權的問題(結果作爲一個值傳遞回來,因此也是你的),但是因爲它是一個對象,所以不存在資源分配的問題或問題。

如果您擔心效率問題,我認爲這是一個錯誤的擔憂。

如果你想這種經由流打印已經有做一個標準的約定:

std::cout << std::boolalpha << false << std::endl; 
std::cout << std::boolalpha << true << std::endl;