2012-08-11 23 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)。

相关问题