El \u000d
escape finaliza un comentario porque los \u
escapes se convierten uniformemente a los caracteres Unicode correspondientes antes de que el programa se tokenice. Se podría utilizar igualmente \u0057\u0057
en lugar de //
a comenzar un comentario.
Este es un error en su IDE, que debe sintaxis resaltar la línea para dejar en claro que \u000d
finaliza el comentario.
Esto también es un error de diseño en el lenguaje. No se puede corregir ahora, porque eso rompería los programas que dependen de él. \u
el compilador debe convertir los escapes al carácter Unicode correspondiente solo en contextos donde eso "tiene sentido" (literales de cadena e identificadores, y probablemente en ningún otro lugar) o se les debería haber prohibido generar caracteres en el rango U + 0000–007F , o ambos. Cualquiera de esas semánticas habría evitado que el comentario terminara con el \u000d
escape, sin interferir con los casos en los que los \u
escapes son útiles; tenga en cuenta que eso incluye el uso de \u
escapes dentro de los comentarios como una forma de codificar comentarios en un script no latino, porque el editor de texto podría tener una visión más amplia de dónde\u
los escapes son significativos que el compilador. (Sin embargo, no conozco ningún editor o IDE que muestre \u
escapes como los caracteres correspondientes en ningún contexto).
Hay un error de diseño similar en la familia C, 1 donde la barra diagonal inversa-nueva línea se procesa antes de que se determinen los límites de los comentarios, por ejemplo
// this is a comment \
this is still in the comment!
Menciono esto para ilustrar que resulta fácil cometer este error de diseño en particular, y no darme cuenta de que es un error hasta que sea demasiado tarde para corregirlo, si estás acostumbrado a pensar en la tokenización y analizar la forma en que piensan los programadores del compilador. sobre tokenización y análisis. Básicamente, si ya ha definido su gramática formal y luego a alguien se le ocurre un caso especial sintáctico: trigrafos, barra invertida-nueva línea, codificación de caracteres Unicode arbitrarios en archivos fuente limitados a ASCII, lo que sea, que necesita ser encajado, es más fácil agregue un pase de transformación antes del tokenizador que redefinir el tokenizador para prestar atención a dónde tiene sentido usar ese caso especial.
1 Para los pedantes: Soy consciente de que este aspecto de C fue 100% intencional, con la razón, no estoy inventando esto, de que te permitiría forzar mecánicamente el código de ajuste forzado con líneas arbitrariamente largas en tarjetas perforadas. Todavía era una decisión de diseño incorrecta.