2012-10-28 25 views
6

讓我們考慮從C++ 11標準以下的報價(the N3376 draft,要準確):用戶定義的字符串文字與Vs.其它用戶定義的字面

(2.14.8.5)

如果L是一個用戶自網絡ned-字符串文字,讓str是沒有它的ud-suffi x的文字,並且讓len是str中的代碼單元的數目(即,其長度不包括終止空字符)。字面L被 視爲如下形式的呼叫

 operator "" X (str , len) 

而對於所有其它類型的用戶定義的文本(浮點,整數,字符)的長度是永遠不會一起被傳遞,即使文字本身作爲一個字符串傳遞。例如:

42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2) 

爲什麼字符串和非字符串用戶定義字面值之間存在這種區別?或者我應該說,爲什麼該實現將UD字符串文字傳遞給len?正如其他文字一樣,長度可以通過空終止來推斷。我錯過了什麼?

+0

可能與編碼/字符集有關。在那之前的其他段落都有「[注:序列c1c2 ... ck只能包含來自基本源字符集的字符 - 結束註釋]」。 – Mat

+0

@Mat:但是其他編碼或字符集的字符串仍然以null結尾,不是嗎? –

+0

空終止是不夠的。我猜「基本源字符集」不包括'\ 0'。 – Mat

回答

8

對於字符串文字,可以合理設想將空字符嵌入到字符串序列中,例如"a\0b"。爲了允許實現消耗整個字符串文本,即使存在嵌入的空字符,它也需要知道文字的長度。用戶定義的文字的其他形式不能包含嵌入的零字符。

+0

順便提一下,甚至在C99中定義宏也是可能的,當使用標識符和字符串文字進行調用時,將創建一個編譯時常量結構,該結構的名稱包含字符串的長度,後跟包含字符串文本但不包含尾部的數組null(不知道它是否可以在C11下編譯清理)。不知道C++中的用戶定義字符串類型是否可以實現這樣的功能,但如果是這樣的話,它看起來很方便。 – supercat

+0

@supercat:我不爭辯你*可以*確定字符串文字的長度。然而,如果你只傳遞了一個'char const *',你不能確定字符串的長度!通過查找空字符來確定大小的傳統方式僅確定字符串的大小,直到第一個空字符。不知何故,需要字符串文字的大小(這就是你所描述的宏所依賴的:它只是使用'sizeof(literal)-1'來確定文字中字符的數量(不包括尾部的'\ 0') –

+0

當然,字符串的大小是必需的,這就是爲什麼我提到的結構將它放在字符串之前的原因;我的觀點是即使在C宏中,也可以使用字符串的長度作爲整數常量。 ,我的代碼使用了不同的宏,這些宏根據字符串是0-63字節,0-2047還是0-16777215 [使用1,2或4字節前綴]生成不同的結構。還有宏來初始化邊界 - 檢查帶有一個,兩個和四個字節前綴的字符串緩衝區字符串處理方法自動檢測前綴類型,也可以... – supercat

6

串總是空終止在C/C++,但它從來不吝嗇自己不能包含嵌入\0性格,你可能有"1234\05678"雖然這串空終止,它包含一個額外的「\ 0`在裏面。

相關問題