2012-08-11 15 views

Respuesta

11

¿No utiliza un const(char)*?

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

literales de cadena en D son de tipo string, que no debe necesitar usar un const(char)*, excepto cuando la interfaz con el código C.

El motivo D no permite que la concatenación se deba a que const(char)* no es una cadena, en ningún sentido de la palabra. Las cadenas en D son immutable(char)[] (que es alias 'd por string). Un const(char)* es solo un puntero a un carácter constante. A diferencia de C y C++, no hay un terminador nulo implícito, por lo que D no puede ni va a suponer que haya uno.

Si por cualquier razón que sea absolutamente necesario utilizar un const(char)* y saber que termine con un nulo, entonces se puede hacer un const(char)[] fuera de él por corte, que luego se puede añadir a un string:

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

Cortar 'foo' no te da una' cadena', sino 'const (char) []'. Todavía es compatible para la concatenación con 'string bar', pero obtendría un error si intentara almacenar el resultado de cortar' foo' en una variable 'string'. –

+0

@jA_cOp: Bien visto, lo arreglaré. –

+0

¿La cadena termina en nulo en la memoria, o debería escribir bar ~ = foo [0..strlen (foo) +1]; en la última línea para C interoperabilidad? –

4

string es un alias para immutable(char)[], es decir, una porción mutable de caracteres inmutables. bar en su código es una porción de matriz de este tipo.

La relación entre const(char)* y de cadena literales en D es sólo que los literales de cadena son siempre terminada en nulo, y escriben ya sea como immutable(char)[] (es decir string), o immutable(char)* para la interoperabilidad conveniente con el código de C; el último es implícitamente convertible a const(char)*. Es importante tener en cuenta que esto es sólo el caso de literales de cadena: matrices no están necesariamente terminada en nulo en el caso general, y no son convertir implícitamente a su equivalente puntero (aunque el miembro .ptr de cualquier rebanada T[] es de escriba T* y apunta al primer elemento del sector).

Los operadores de concatenación trabajan con matrices, así como tipos definidos por el usuario con las sobrecargas de operador relevantes, y nada más. Como D no permite la sobrecarga de operadores para tipos incorporados, no es posible hacer que funcionen con punteros.

La solución es hacer que una porción de la cadena el puntero apunta a, utilizando el operador de parte que trabaja en arreglos y apuntadores por igual:

import core.stdc.string : strlen; 

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

En lo anterior, la expresión foo[0 .. strlen(foo)] es de tipo const(char)[] , que puede concatenarse con bar, que es del tipo immutable(char)[] (es decir, string).

Cuestiones relacionadas