En cuanto al análisis sintáctico de las directivas del preprocesador, el estándar C99 (y el estándar C89 anterior) tenían claro la secuencia de operaciones que realizaba lógicamente el compilador. En particular, creo que significa que este código:
/* */ # /* */ include /* */ <stdio.h> /* */
es equivalente a:
#include <stdio.h>
Para bien o para mal, GCC 3.4.4 con '-std = c89 -pedantic' acepta la línea cargada de comentarios, en cualquier caso. No estoy defendiendo eso como estilo, ni por un segundo (es espantoso). Simplemente creo que es posible.
ISO / IEC 9899: 1999 sección 5.1.1.2 Fases de traducción dice:
[Mapeo de caracteres, incluidos trígrafos]
[Empalme de línea: eliminación de la nueva línea de barra invertida]
El archivo de origen se descompone en tokens de preprocesamiento y secuencias de caracteres de espacio en blanco (incluidos los comentarios). Un archivo fuente no debe terminar en un token de preprocesamiento parcial o en un comentario parcial. Cada comentario se reemplaza por un carácter de espacio. Se conservan los caracteres de nueva línea. Si cada secuencia no vacía de caracteres de espacio en blanco que no sea nueva línea se retiene o se reemplaza por un carácter de espacio, está definido por la implementación.
Se ejecutan las directivas de preprocesamiento, se amplían las invocaciones de macros, [...]
La Sección 6.10 Directivas de preprocesamiento dice:
Una directiva de preprocesamiento consiste en una secuencia de tokens de preprocesamiento que comienza con un # token de preprocesamiento que (al comienzo de la fase de traducción 4) es el primer carácter en el archivo fuente (opcionalmente después del espacio en blanco que no contiene caracteres de nueva línea) o que sigue un espacio en blanco que contiene al menos un carácter de nueva línea y finaliza con el siguiente carácter de nueva línea.
La única disputa posible es la expresión entre paréntesis '(al inicio de la fase de traducción 4)', lo que podría significar que los comentarios antes del hash deben estar ausentes, ya que de lo contrario no se reemplazan por espacios hasta el final de la fase 4.
Como han señalado otros, los preprocesadores de C anteriores al estándar no se comportaban de manera uniforme de varias maneras, y los espacios antes y en las directivas del preprocesador eran una de las áreas en las que los diferentes compiladores hacían cosas diferentes, incluido no reconocer las directivas del preprocesador con espacios delante de ellas. .
Cabe destacar que la eliminación de la barra invertida y la nueva línea se produce antes de que se analicen los comentarios. En consecuencia, no debe terminar los //
comentarios con una barra invertida.