Este código es correcto en todas las plataformas. La cadena se compila en el binario como un literal de cadena estática. Si está en Windows, por ejemplo, incluso puede abrir su .exe con el bloc de notas y buscar la cadena en sí.
Dado que es una cadena estática, el alcance literal no importa.
cadena puesta en común:
Una cosa a tener en cuenta es que, en algunos casos, los literales de cadena idénticos pueden ser "agrupados" para ahorrar espacio en el archivo ejecutable. En este caso, cada literal de cadena que sea el mismo podría tener la misma dirección de memoria. Sin embargo, nunca debes asumir que será o no será el caso.
En la mayoría de los compiladores puede configurar si se usa o no la agrupación de cadenas estáticas para mezclar literales.
tamaño máximo de los literales de cadena:
Varios compiladores tienen un tamaño máximo para la cadena literal. Por ejemplo, con VC++ esto es aproximadamente 2.048 bytes.
Modificación de una cadena literal da un comportamiento indefinido:
Modificación de una cadena literal nunca debe hacerse. Tiene un comportamiento indefinido.
char * sz = "this is a test";
sz[0] = 'T'; //<--- undefined results
literales de cadena Ancho:
Todo lo anterior se aplica igualmente a los literales de cadena de ancho.
Ejemplo: L "esto es una cadena literal ancha";
El C++ estados estándar: (sección lex.string)
1 Una cadena literal es una secuencia de caracteres (tal como se define en lex.ccon) rodeado por comillas dobles, opcionalmente comenzando con la letra L de , como en "..." o L "...". Un literal de cadena que no comienza en con L es un literal de cadena ordinario, también conocido como literal de cadena estrecho. Una cadena ordinaria literal tiene tipo "matriz de n const char" y la duración de almacenamiento estático (basic.stc), donde n es el tamaño de la cadena como se define a continuación, y se inicializa con los dados caracteres.Un literal de cadena que comienza con L, como L "asdf", es literal de cadena ancha. Una amplia cadena literal tiene tipo "array de n wchar_t const" y tiene una duración de almacenamiento estático, donde n es el tamaño de la cadena como se define a continuación, y se inicializa con los dados terísticas tros.
2 Si todos los literales de cadena son distintos (es decir, se almacenan en objetos que no se superponen) está definido por la implementación. El efecto de intentando modificar una cadena literal no está definido.
Ya que menciona explícitamente los literales de cadena de ancho, hacen todos los literales se comportan de esa manera? Con cada me refiero a los literales compuestos c99. – quinmars
no puedo pensar en cualquier otra literales que esto podría aplicarse a, pero podría haber otros.Otros literales tendrían sus propias reglas, pero en relación con su pregunta original, si devolvió, por ejemplo, un número entero, entonces sí, eso es seguro. –
Lo que quise decir es que las construcciones C99 donde se puede crear una estructura o una matriz sobre la marcha como (int []) {1, 2, 3, 4}. Sé que esto no fue parte de mi pregunta inicial, pero como mencionaste literales de cadenas anchas, tengo curiosidad sobre los otros literales :). – quinmars