c++ - salto - secuencias de escape en c pdf
¿Es obligatorio escapar de los caracteres tabuladores en C y C++? (4)
En C y C ++ (y en varios otros idiomas), los tabuladores horizontales (código ASCII 9) en caracteres y constantes de cadena se denotan en forma de escape como
''/t''
y
"/t"
.
Sin embargo, escribo regularmente el carácter de tabulador sin escape en literales de cadena como, por ejemplo, en
"A B"
(hay una TAB en betreen
A
y
B
), y al menos clang ++ no parece molestar: la cadena parece ser equivalente a
"A/tB"
.
Me gusta más la versión sin escape, ya que las cadenas de varias líneas con sangría largas se pueden leer mejor en el código fuente.
Ahora me pregunto si esto es generalmente legal en C y C ++ o si solo es compatible con mi compilador. ¿Qué tan portátiles son los tabuladores sin escape en las constantes de caracteres y cadenas?
Sorprendentemente, no pude encontrar una respuesta a esta pregunta aparentemente simple, ni con Google ni en stackoverflow (acabo de encontrar this pregunta vagamente relacionada).
Cuando presiona la tecla TAB, obtiene el punto de código al que su sistema asigna esa tecla. Ese punto de código puede o no ser una pestaña en el sistema donde se ejecuta el programa. Cuando coloca / t en un literal, el compilador lo reemplaza con el punto de código apropiado para el sistema de destino. Entonces, si desea asegurarse de obtener una pestaña en el sistema donde se ejecuta el programa, use / t. Ese es su trabajo.
Es completamente legal colocar un carácter de tabulación directamente en una cadena de caracteres o literal de caracteres. Los estándares C y C ++ requieren que el conjunto de caracteres de origen incluya un carácter de tabulación, y los literales de cadena y caracteres pueden contener cualquier carácter en el conjunto de caracteres de origen, excepto la barra diagonal inversa, la comilla o el apóstrofe (según corresponda) y la nueva línea.
Entonces es portátil. Pero no es una buena idea, ya que no hay forma de que un lector pueda distinguir entre diferentes tipos de espacios en blanco. También es bastante común que los editores de texto, los programas de correo y otros similares vuelvan a formatear las pestañas, por lo que pueden introducirse errores en el programa en el transcurso de tales operaciones.
Sí, puede incluir un carácter de tabulación en una cadena o literal de caracteres, al menos de acuerdo con C ++ 11. Los caracteres permitidos incluyen (con mi énfasis):
cualquier miembro del conjunto de caracteres de origen excepto la comilla doble
"
, barra invertida/
o carácter de nueva línea
(del estándar C ++ 11 , anexo A.2)
y el conjunto de caracteres fuente incluye:
el carácter de espacio, los caracteres de control que representan tabulación horizontal , tabulación vertical, avance de formulario y nueva línea, más los siguientes 91 caracteres gráficos
(del estándar C ++ 11 , párrafo 2.3.1)
ACTUALIZACIÓN: Acabo de notar que estás preguntando acerca de dos idiomas diferentes. Para C99, la respuesta también es sí. La redacción es diferente, pero básicamente dice lo mismo:
En una constante de caracteres o literal de cadena, los miembros del conjunto de caracteres de ejecución se representarán por los miembros correspondientes del conjunto de caracteres de origen o [...]
donde los conjuntos de caracteres de origen y ejecución incluyen
controle los caracteres que representan la pestaña horizontal , la pestaña vertical y el feed de formulario.
Si ingresa una pestaña en una entrada, su cadena contendrá un carácter de tabulación literal y seguirá siendo un carácter de tabulación; no se traducirá mágicamente a
/t
internamente.
Lo mismo ocurre con la escritura de código: puede incrustar caracteres de tabulación literales en sus cadenas. Sin embargo, considere esto:
T T T <--tab stops
012345012345012345012345
foo1 = ''a/tb'';
foo2 = ''a b''; // pressed tab in the editor
foo3 = ''a b''; // hit space twice in the editor
A menos que coloque el cursor en el espacio en blanco entre
a
y
b
y compruebe cuántos caracteres hay allí, esencialmente NO hay forma de determinar si hay una pestaña o caracteres de espacio real allí.
Pero con la versión
/t
, se muestra inmediatamente como una pestaña.