Concernant l'analyse des directives de préprocesseur, le standard C99 (et la norme C89 avant) étaient claires à propos de la séquence des opérations effectuées logiquement par le compilateur. En particulier, je crois que ça veut dire 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 -pédant' accepte le commentaire-laden ligne, à n'importe quel taux. Je ne dis pas que comme un style pas une seconde (c'est horrible). Je pense juste que c'est possible.
ISO/IEC 9899:1999 section 5.1.1.2 Traduction phases dit:
[Mappage de caractères, y compris trigraphs]
[Épissage en ligne - suppression de la barre oblique inverse newline]
Le fichier source est décomposé en un prétraitement des jetons et des séquences de
des espaces blancs (y compris les commentaires). Un fichier source ne doit pas finir dans un
partielle de prétraitement de jeton ou d'une partie du commentaire. Chaque commentaire est remplacé par
un caractère d'espace. Les caractères de nouvelle ligne sont conservés. Si chaque non vide
la séquence de caractères d'espacement autres qu'une nouvelle ligne est conservé ou remplacé par
un espace est mise en œuvre définies.
Prétraitement des directives sont exécutées, macro invocations sont élargies, la [...]
L'article 6.10 de Prétraitement des directives dit:
Un prétraitement de la directive consiste en une séquence de prétraitement des jetons qui commence avec
un # prétraitement jeton (au début de la phase de traduction de l'4) est le premier caractère
dans le fichier source (éventuellement après l'espace blanc ne contenant pas de caractères de nouvelle ligne) ou que
suit espace blanc contenant au moins un caractère de nouvelle ligne, et est terminée par la prochaine
caractère de nouvelle ligne.
La seule contestation possible est la mise entre parenthèses de l'expression '(au début de la phase de traduction de l'4)", ce qui pourrait signifier que les commentaires avant le hachage doit être absent, car ils ne sont pas remplacés par des espaces jusqu'à la fin de la phase 4.
Comme d'autres l'ont noté, la pré-norme C préprocesseurs ne se comportent pas de manière uniforme dans un certain nombre de façons, et les espaces avant et dans les directives de préprocesseur est l'un des domaines où les différents compilateurs fait différentes choses, y compris de ne pas reconnaître les directives de préprocesseur avec des espaces devant eux.
Il est à noter que l'anti-slash-saut de ligne et le retrait se produit avant que les commentaires sont analysés.
Par conséquent, vous ne devriez pas fin //
commentaires avec une barre oblique inverse.