¿Hay alguna manera de tener texto plano de varias líneas, literales constantes en C ++, a la Perl? Tal vez algún truco de análisis con #include
un archivo? No puedo pensar en uno, pero chico, eso sería bueno. Sé que estará en C ++ 0x.
c++
string-literals
rlbond
fuente
fuente
Respuestas:
Especie de. Lo más fácil es usar el hecho de que el compilador concatena literales de cadena adyacentes:
La sangría no importa, ya que no está dentro de las comillas.
También puede hacerlo, siempre y cuando tenga cuidado de escapar de la nueva línea incrustada. De lo contrario, como lo hizo mi primera respuesta, no se compilará:
Nuevamente, tenga en cuenta esas barras invertidas al final de cada línea, deben estar inmediatamente antes de que la línea termine, están escapando de la nueva línea en la fuente, de modo que todo actúe como si la nueva línea no estuviera allí. No obtienes nuevas líneas en la cadena en los lugares donde tenías barras invertidas. Con este formulario, obviamente no puede sangrar el texto, ya que la sangría pasaría a formar parte de la cadena y la confinaría con espacios aleatorios.
fuente
En C ++ 11 tiene literales de cadena sin formato. Algo así como texto aquí en shells y lenguajes de script como Python y Perl y Ruby.
Todos los espacios y sangría y las nuevas líneas en la cadena se conservan.
También pueden ser utf-8 | 16 | 32 o wchar_t (con los prefijos habituales).
Debo señalar que la secuencia de escape, V0G0N, no es realmente necesaria aquí. Su presencia permitiría poner) "dentro de la cadena. En otras palabras, podría haber puesto
(tenga en cuenta las comillas adicionales) y la cadena anterior aún sería correcta. De lo contrario, podría haber usado
Todavía se necesitan los parens dentro de las comillas.
fuente
#if 0
...#endif
para comentar bloques de código. Nidos también.#define MULTILINE(...) #__VA_ARGS__
Consume todo entre paréntesis.
Reemplaza cualquier cantidad de caracteres de espacio en blanco consecutivos por un solo espacio.
fuente
\n
si necesita nuevas líneas` (and hence
\ n) is copied literally, but
"` se convierte en\"
. Por lo tanto,MULTILINE(1, "2" \3)
rinde"1, \"2\" \3"
.Una forma probablemente conveniente de ingresar cadenas de varias líneas es mediante el uso de macros. Esto solo funciona si las comillas y paréntesis están equilibrados y no contiene comas de 'nivel superior':
Compilado con gcc 4.6 o g ++ 4.6, esto produce:
[[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]
Tenga en cuenta que
,
no puede estar en la cadena, a menos que esté entre paréntesis o comillas. Las comillas simples son posibles, pero crean advertencias del compilador.Editar: como se menciona en los comentarios,
#define MULTI_LINE_STRING(...) #__VA_ARGS__
permite el uso de,
.fuente
#define MULTILINE(...) #__VA_ARGS__
si desea que su cadena contenga comas.\n
y\r
), lo que es útil para algunos casos y fatal para otros.También puedes hacer esto:
fuente
char longString[] = R""""( This is a very long string )"""";
también funciona para mí.Puedes hacer esto:
fuente
Dado que una onza de experiencia vale un montón de teoría, probé un pequeño programa de prueba para
MULTILINE
:Compile este fragmento con
cpp -P -std=c++11 filename
para reproducir.El truco detrás
#__VA_ARGS__
es que__VA_ARGS__
no procesa el separador de coma. Para que pueda pasarlo al operador de encadenamiento. Los espacios iniciales y finales se recortan, y los espacios (incluidas las nuevas líneas) entre palabras se comprimen en un solo espacio. Los paréntesis deben ser equilibrados. Creo que estas deficiencias explican por qué los diseñadores de C ++ 11, a pesar de eso#__VA_ARGS__
, vieron la necesidad de literales de cadena sin formato.fuente
Solo para dilucidar un poco sobre el comentario de @emsr en la respuesta de @windind, si uno no tiene la suerte de tener un compilador de C ++ 11 (por ejemplo, GCC 4.2.1), y quiere insertar las nuevas líneas en la cadena (ya sea char * o cadena de clase), se puede escribir algo como esto:
Muy obvio, cierto, pero el breve comentario de @emsr no me llamó la atención cuando lo leí la primera vez, así que tuve que descubrirlo por mí mismo. Con suerte, he salvado a otra persona unos minutos.
fuente
fuente
Opción 1. Usando la biblioteca de impulso, puede declarar la cadena de la siguiente manera
Opción 2. Si boost no está disponible en su proyecto, puede usar std :: string_view () en C ++ moderno.
fuente