2010-04-08 9 views
14

Necesito hacer el siguiente código C# en C++ (si es posible). Tengo que construir una cadena larga con muchas citas increíbles y otras cosas en ella.Cadenas literales C++?

const String _literal = @"I can use "quotes" inside here"; 
+1

¿Por qué no cargar una cadena tan larga del archivo? – GManNickG

Respuesta

5

No hay literales de cadena sin formato en C++. Necesitarás escapar tus literales de cadena.

std::string str = "I can use \"quotes\" inside here"; 

C++ 0x ofrece una cadena de texto literal cuando esté disponible:

R"C:\mypath" 

Por cierto que no debería nombrar cualquier cosa con un subrayado inicial como están reservados tales identificadores en C++.

+0

Los nombres que comiencen con un guión bajo y luego con una letra mayúscula se reservan para la implementación para cualquier uso, por lo que no puede usarlos en absoluto. Los nombres que comienzan con un guión bajo en general solo se reservan como nombres en el espacio de nombres global. –

+1

@Brian - cadenas sin formato utilizan paréntesis 'R" (C: \ mypath) "' –

2

No existe tal mecanismo en C++. Tendrás que hacerlo a la vieja usanza, usando escapes.

Sin embargo, es posible que pueda utilizar un lenguaje de scripts para facilitar un poco la parte de escape. Por ejemplo, el operador %Q en Ruby devolverá una cadena escapado apropiadamente entre comillas dobles-cuando se utiliza en irb:

irb(main):003:0> %Q{hello "world" and stuff  with tabs} 
=> "hello \"world\" and stuff\twith\ttabs" 
+0

¿En serio está sugiriendo incrustar un intérprete de Ruby en su programa C++ solo para escapar de una cadena? – jalf

+0

@jalf: ¡Absolutamente no! Estaba sugiriendo pegar la cadena en Ruby una vez, luego pegar ese resultado en su archivo fuente. Sin embargo, puedo ver dónde podría interpretarse mi respuesta de esa manera tan ridícula. –

7

No hay un equivalente de C# 's '@' en C++. La única manera de lograrlo es escaparse de la cadena correctamente:

const char *_literal = "I can use \"quotes\" inside here"; 
35

Eso no está disponible en C++ 03 (el estándar actual).

Eso es parte del borrador del estándar C++ 0x pero aún no está disponible.

Por ahora, sólo hay que citar explícitamente:

const std::string _literal = "I have to escape my quotes in \"C++03\""; 

Una vez que C++ 0x se convierte en realidad, usted será capaz de escribir:

const std::string _literal = R"(but "C++0x" has raw string literals)"; 

y cuando es necesario )" en su literal:

const std::string _literal = R"DELIM(more "(raw string)" fun)DELIM"; 
+7

+1 por educarme. – paxdiablo

+0

@paxdiablo - de nada. En una nota lateral, mi ejemplo anterior era incorrecto. Las cadenas sin formato usan paréntesis, no corchetes, como delimitadores. También las cadenas sin formato tienen más flexibilidad, como muestra mi ejemplo (puede agregar un delimitador para poder poner ')" 'en la cadena real. –

+0

+1 para la parte DELIM, realmente útil. – qed

Cuestiones relacionadas