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.
Jonathan Leffler
la source
#ifdef
lignes dans les parties où j'ai du code réel. Au lieu de cela, si j'ai besoin de choses conditionnelles, je les mets dans des fonctions factorisées ou des macros factorisées; c'est beaucoup plus clair comme ça que je trouve (enfin, du moins c'est pour moi). Idéalement, toutes ces parties exclues seront dans d'autres fichiers (en-têtes ou fichiers sources compilés conditionnellement; la "condition" habituelle étant la plate-forme pour laquelle le code est construit).Pour l'exemple que vous avez donné, il peut être approprié d'utiliser l'indentation pour le rendre plus clair, étant donné que vous avez une structure aussi complexe de directives imbriquées.
Personnellement, je pense qu'il est utile de les garder non indentés la plupart du temps, car ces directives fonctionnent séparément du reste de votre code. Les directives telles que #ifdef sont gérées par le pré-processeur, avant que le compilateur ne voie votre code, donc un bloc de code après une directive #ifdef peut même ne pas être compilé .
Garder les directives séparées visuellement du reste de votre code est plus important lorsqu'elles sont entrecoupées de code (plutôt que d'un bloc de directives dédié, comme dans l'exemple que vous donnez).
la source
Une solution courante consiste à commenter les directives, afin de savoir facilement à quoi elles font référence:
la source
Dans presque tous les compilateurs C / RPC actuellement disponibles, il n'est pas limité. C'est à l'utilisateur de décider comment vous souhaitez aligner le code. Si bon codage.
la source