[gull] define sur plusieurs lignes.

Marc Mongenet marc at mongenet.ch
Thu May 22 22:48:49 CEST 2008


2008/5/22 Yann Sagon <ypublic at hasa.ch>:
> Bonjour,
>
> Petite question ht pour les pros du "c" et dérivés.
>
> Il semble qu'un define sur plusieurs lignes ne soit pas pris accepté par gcc
> 2.95 (entre autre)
>
> sur plusieurs lignes je veux dire par exemple ainsi:
>
> #define change_var \
> ma_var = true;
>
> Est-ce que cette manière de déclarer un define n'est pas conforme ou c'est
> simplement mal parsé par certains preprocesseur?
>
> Y a t'il un "standard"?
>
> Merci

Bonsoir,

Le comportement du préprocesseur C est normalisé avec le
reste du langage. Le collage (splicing) des lignes se terminant
par « \ » est très couramment utilisé, conforme, et supporté
par tous les préprocesseurs. C'est indépendant du fait que ce
soit utilisé dans un #define ou pas. Donc pour conclure, on
peut utiliser « \ » en fin de ligne tant qu'on veut.


Cela dit, le préprocesseur de GCC 3.0 a effectivement été
réécrit, et la page
http://ftp.sunsite.ualberta.ca/Documentation/Gnu/gcc-3.0.2/html_mono/cppinternals.html
donne beaucoup de détails sur les subtilités du préprocesseur.

Une différence minime entre le préprocesseur de GCC 3.0
et la norme ISO (et peut-être le préprocesseur de GCC 2.95)
est que le préprocesseur de GCC 3.0 traite de la même
façon un « \ » immédiatement suivi d'un retour à la ligne et
un « \ » suivi d'espace(s) blanc(s) suivi(s) d'un retour à la
ligne. Exemple :

#define change_var \
ma_var = true;

et

#define change_var \
ma_var = true;

sont traités de la même manière par GCC 3, mais pas
forcément par d'autres préprocesseurs. Notons toutefois
que le second cas cause l'émission d'un avertissement.

Parmi les subtilités du préprocesseur, l'exemple suivant
est décrit (à compiler avec l'option -ansi) :

/??/
* Commentaire */

Le trigraphe « ??/ » est d'abord remplacé par « \ » :

/\
* Commentaire */

Comme le « \ » est suivi d'un retour à la ligne, les
deux lignes sont collées sans espace :

/* Commentaire */

Et nous avons bien un commentaire C.

Note : L'article de Wikipédia en anglais sur le
préprocesseur C décrit bien les phases de traitement :
http://en.wikipedia.org/wiki/C_preprocessor#Phases

-- 
Marc Mongenet
Creator of the Web 2 Markup Language
http://w2ml.com



More information about the gull mailing list