代碼爲什麼我不能將const(char)*連接到D中的字符串?
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
失敗在第三行編譯。爲什麼?我有什麼優雅的替代品?
錯誤輸出爲Error: cannot append type const(char)* to type string
。
代碼爲什麼我不能將const(char)*連接到D中的字符串?
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
失敗在第三行編譯。爲什麼?我有什麼優雅的替代品?
錯誤輸出爲Error: cannot append type const(char)* to type string
。
請勿使用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)[]
出來的
string
是immutable(char)[]
的別名,即不可變字符的可變片。您的代碼中的bar
是此類型的數組切片。
在d const(char)*
和字符串之間的關係僅僅是字符串文字總是以NULL終止的,並分類爲任一immutable(char)[]
(即string
),或immutable(char)*
用於與C代碼方便的互操作性;後者可以隱式轉換爲const(char)*
。需要注意的是這只是字符串文字的情況下是很重要的:數組不一定空終止在一般情況下,他們是不隱式轉換爲它們的指針當量(雖然任何切片的成員.ptr
T[]
是鍵入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
)。
foo'不會給你一個字符串,而是給你const(char)[]'。它與'string bar'串接仍然兼容,但是如果你試圖將'foo'切片結果存儲在一個'string'變量中,你會得到一個錯誤。 – 2012-08-11 17:51:16
@jA_cOp:發現了,我會解決它。 – 2012-08-11 17:57:08
該字符串然後在內存中以null結尾,或者我應該寫bar〜= foo [0..strlen(foo)+1];在C interop的最後一行? – 2012-08-13 06:45:05