Per quanto riguarda l'analisi delle direttive del preprocessore, lo standard C99 (e lo standard C89 prima di esso) erano chiari sulla sequenza delle operazioni eseguite logicamente dal compilatore. In particolare, credo significhi che questo codice:
/* */ # /* */ include /* */ <stdio.h> /* */
è equivalente a:
#include <stdio.h>
Nel bene e nel male, GCC 3.4.4 con '-std = c89 -pedantic' accetta la riga carica di commenti, in ogni caso. Non lo sto sostenendo come uno stile - non per un secondo (è orribile). Penso solo che sia possibile.
ISO / IEC 9899: 1999 sezione 5.1.1.2 Fasi di traduzione dice:
[Mappatura dei caratteri, compresi i trigrafi]
[Unione di righe - rimozione della nuova riga con barra rovesciata]
Il file di origine viene scomposto in token di pre-elaborazione e sequenze di caratteri di spazio vuoto (inclusi i commenti). Un file sorgente non deve terminare in un token di pre-elaborazione parziale o in un commento parziale. Ogni commento è sostituito da uno spazio. I caratteri di nuova riga vengono mantenuti. L'implementazione definisce se ogni sequenza non vuota di caratteri di spazio vuoto diverso da new-line viene mantenuta o sostituita da un carattere di spazio.
Le direttive di pre-elaborazione vengono eseguite, le chiamate di macro vengono espanse, [...]
La sezione 6.10 Direttive di pre-elaborazione dice:
Una direttiva di pre-elaborazione consiste in una sequenza di token di pre-elaborazione che inizia con un # token di pre-elaborazione che (all'inizio della fase di traduzione 4) è il primo carattere nel file sorgente (opzionalmente dopo uno spazio bianco che non contiene caratteri di nuova riga) o quello segue uno spazio bianco contenente almeno un carattere di nuova riga e termina con il successivo carattere di nuova riga.
L'unica controversia possibile è l'espressione tra parentesi '(all'inizio della fase di traduzione 4)', che potrebbe significare che i commenti prima dell'hash devono essere assenti poiché non sono altrimenti sostituiti da spazi fino alla fine della fase 4.
Come altri hanno notato, i preprocessori C pre-standard non si comportavano in modo uniforme in molti modi, e gli spazi prima e nelle direttive del preprocessore erano una delle aree in cui compilatori diversi facevano cose diverse, incluso il non riconoscere le direttive del preprocessore con spazi davanti a loro .
È interessante notare che la rimozione del backslash-newline avviene prima che i commenti vengano analizzati. Di conseguenza, non terminare i //
commenti con una barra rovesciata.