2012-08-11 13 views

cevap

11

const(char)*'u kullanmıyor musunuz? D

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

dize hazır Hiç C kodu ile arayüz dışında, bir const(char)* kullanmak gerekmez, tip string vardır.

D'nin bu birleştirmeye izin vermemesinin nedeni, kelimenin herhangi bir anlamıyla const(char)* bir dize olmadığından. D dizeleri immutable(char)[] (alias 'd string' dır). const(char)*, sabit bir karakterin sadece bir göstergesidir. C ve C++ 'dan farklı olarak, hiçbir zımni sıfır sonlandırıcı yoktur, bu yüzden D olamaz ve var olduğunu varsaymaz.

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

sebebi ne olursa olsun kesinlikle bir const(char)* kullanmalıdır ve bunu boş sonlandırılmış olduğunu biliyor için, o zaman sonra bir string eklenecek hangi, dilimleme bunun dışında bir const(char)[] yapabilirsiniz

+2

"Foo" 'nun kesilmesi size bir "string", ancak const (char) [] 'vermez. Dize çubuğu ile birleştirme için hala uyumlu, ancak bir 'dize 'değişkeninde' foo 'dilimleme sonucunu saklamayı denediğinizde bir hata alırsınız. –

+0

@jA_cOp: İyi fark ettim, düzelteceğim. –

+0

bellekte boş sonlandırılmış dize mi, yoksa çubuk ~ = foo yazmak gerekir [0..strlen (foo) + 1]; C interop için son satırda? –

4

string, immutable(char)[] için bir diğer addır, başka bir deyişle, değişmez karakterlerden oluşan değişebilir bir dilimdir. Kodunuzda bar, bu tür bir dizi dilimdir.

D const(char)* ve dizgilerin arasındaki ilişki sadece dize hazır zaman sona erer ve olarak yazılmış null ya immutable(char)[] (yani string) ya da Cı-kodu ile uygun bir birlikte çalışma için immutable(char)*; İkincisi, dolaylı olarak const(char)*'a dönüştürülebilir. Bu dize hazır için sadece bir örnek olduğuna dikkat etmek önemlidir: diziler illa genel durumda null terminated değildir ve herhangi bir dilimin üyesi .ptrT[] ait olsa mutlaka (işaretçi eşdeğer örtük olarak dönüştürülebilir değildir T* yazın ve dilimin ilk öğesinin üzerine gelin).

Birleştirme operatörleri, dizilerle ve kullanıcı tanımlı türlerle ilgili operatör aşırı yüklenmeleriyle çalışır ve başka bir şey yoktur. D, dahili tipler için operatörlerin aşırı yüklenmesine izin vermediğinden, bunların işaretçilerle çalışmasını sağlamak mümkün değildir.

çözeltisi hem diziler ve işaretçiler çalışır dilim operatörü kullanılarak, işaretçi noktaları için bir ip dilim yapmaktır: Yukarıda

import core.stdc.string : strlen; 

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

ifade foo[0 .. strlen(foo)] tip const(char)[] ait Bu, immutable(char)[] tipinde (yani string) bar ile birleştirilebilmektedir.

İlgili konular