En ce qui concerne l'analyse des directives du préprocesseur, la norme C99 (et la norme C89 avant elle) étaient claires sur la séquence d'opérations effectuées logiquement par le compilateur. En particulier, je pense que cela signifie que ce code:
/* */ # /* */ include /* */ <stdio.h> /* */
est équivalent à:
#include <stdio.h>
Pour le meilleur ou pour le pire, GCC 3.4.4 avec '-std = c89 -pedantic' accepte en tout cas la ligne chargée de commentaires. Je ne préconise pas cela comme un style - pas une seconde (c'est horrible). Je pense juste que c'est possible.
ISO / CEI 9899: 1999 section 5.1.1.2 Phases de traduction dit:
[Mappage de caractères, y compris les trigraphes]
[Épissure de ligne - suppression de la nouvelle ligne de barre oblique inverse]
Le fichier source est décomposé en jetons de prétraitement et séquences de caractères d'espacement (y compris les commentaires). Un fichier source ne doit pas se terminer par un jeton de prétraitement partiel ou par un commentaire partiel. Chaque commentaire est remplacé par un caractère espace. Les caractères de nouvelle ligne sont conservés. La question de savoir si chaque séquence non vide de caractères d'espace blanc autre que la nouvelle ligne est conservée ou remplacée par un caractère d'espace est définie par l'implémentation.
Les directives de prétraitement sont exécutées, les appels de macro sont développés, [...]
La section 6.10 Directives de prétraitement dit:
Une directive de prétraitement consiste en une séquence de jetons de prétraitement qui commence par un # jeton de prétraitement qui (au début de la phase de traduction 4) est soit le premier caractère du fichier source (éventuellement après un espace blanc ne contenant aucun caractère de nouvelle ligne) ou qui suit un espace blanc contenant au moins un caractère de nouvelle ligne et se termine par le caractère de nouvelle ligne suivant.
Le seul différend possible est l'expression entre parenthèses `` (au début de la phase de traduction 4) '', ce qui pourrait signifier que les commentaires avant le hachage doivent être absents car ils ne sont autrement remplacés par des espaces qu'à la fin de la phase 4.
Comme d'autres l'ont noté, les préprocesseurs C pré-standard ne se comportaient pas uniformément de plusieurs manières, et les espaces avant et dans les directives de préprocesseur étaient l'un des domaines dans lesquels différents compilateurs faisaient des choses différentes, y compris ne pas reconnaître les directives de préprocesseur avec des espaces devant eux. .
Il est à noter que la suppression de la barre oblique inverse-nouvelle ligne se produit avant l'analyse des commentaires. Par conséquent, vous ne devez pas terminer les //
commentaires par une barre oblique inverse.