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.
#ifdef
líneas en las partes en las que tengo código real. En cambio, si necesito cosas condicionales, las pongo en funciones factorizadas o macros factorizadas; es mucho más claro así lo encuentro (bueno, al menos lo es para mí). Idealmente, todas esas partes factorizadas estarán en otros archivos (encabezados o archivos fuente compilados condicionalmente; la "condición" habitual es para qué plataforma se está construyendo el código).Para el ejemplo que ha dado, puede ser apropiado usar sangría para hacerlo más claro, ya que tiene una estructura tan compleja de directivas anidadas.
Personalmente, creo que es útil mantenerlos sin sangría la mayor parte del tiempo, porque estas directivas operan por separado del resto de su código. Las directivas como #ifdef son manejadas por el preprocesador, antes de que el compilador vea su código, por lo que un bloque de código después de una directiva #ifdef puede que ni siquiera se compile .
Mantener las directivas visualmente separadas del resto de su código es más importante cuando están intercaladas con código (en lugar de un bloque dedicado de directivas, como en el ejemplo que da).
fuente
Una solución común es comentar las directivas, para que sepa fácilmente a qué se refieren:
fuente
En casi todos los compiladores C / CPP disponibles actualmente no está restringido. Depende del usuario decidir cómo desea alinear el código. Tan feliz codificación.
fuente