2012-08-11 22 views

回答

11

請勿使用const(char)*

string bar = "Hello "; 
string foo = "world!"; 
bar ~= foo; 

在d字符串文字string型的,你不應該在任何時候需要使用const(char)*,與C語言代碼的接口時除外。

D不允許連接的原因是因爲const(char)*不是任何字符串。 D中的字符串是immutable(char)[](這是alias'd by string)。 A const(char)*只是一個指向常量字符的指針。與C和C++不同,沒有隱含的空終止符,所以D不能也不會假設它有一個。

string bar = "Hello "; 
const(char)* foo = "world!"; 
bar ~= foo[0..strlen(foo)]; 

如果因任何原因,你絕對必須使用const(char)*知道它是空終止,那麼你可以通過切片,然後你就可以追加到一個string做出const(char)[]出來的

+2

foo'不會給你一個字符串,而是給你const(char)[]'。它與'string bar'串接仍然兼容,但是如果你試圖將'foo'切片結果存儲在一個'string'變量中,你會得到一個錯誤。 – 2012-08-11 17:51:16

+0

@jA_cOp:發現了,我會解決它。 – 2012-08-11 17:57:08

+0

該字符串然後在內存中以null結尾,或者我應該寫bar〜= foo [0..strlen(foo)+1];在C interop的最後一行? – 2012-08-13 06:45:05

4

stringimmutable(char)[]的別名,即不可變字符的可變片。您的代碼中的bar是此類型的數組切片。

在d const(char)*和字符串之間的關係僅僅是字符串文字總是以NULL終止的,並分類爲任一immutable(char)[](即string),或immutable(char)*用於與C代碼方便的互操作性;後者可以隱式轉換爲const(char)*。需要注意的是這只是字符串文字的情況下是很重要的:數組不一定空終止在一般情況下,他們是隱式轉換爲它們的指針當量(雖然任何切片的成員.ptrT[]是鍵入T*並指向切片的第一個元素)。

串聯運算符與數組以及用戶定義的類型一起使用,但相關的運算符重載,除此之外沒有別的。由於D不允許爲內置類型重載運算符,因此不可能使它們與指針一起工作。

的解決方案是使所述串的切片中的指針指向,通過使用條算子對數組和指針的工作原理一樣:

import core.stdc.string : strlen; 

string bar = "Hello "; 
const(char)* foo = "world!"; 
bar ~= foo[0 .. strlen(foo)]; 

在上文中,表達foo[0 .. strlen(foo)]const(char)[]類型的,其可與bar連接,其類型爲immutable(char)[](即string)。

相關問題