Ce document dans sa section 2.6 Calculé comprend le paragraphe suivant:
Si la ligne se développe en un jeton commençant par un jeton <et incluant un jeton>, les jetons entre le <et le premier> sont combinés pour former le nom de fichier à inclure. Tout espace entre les jetons est réduit à un seul espace; alors tout espace après le <initial est conservé, mais un espace de fin avant la fermeture> est ignoré . CPP recherche le fichier selon les règles d'inclinaison.
Je sais que cette implémentation est définie, mais pourquoi doit-il en être ainsi pour GCC? Je me réfère spécifiquement à la phrase surlignée ci-dessus.
ÉDITER
Je viens de remarquer que le troisième paragraphe avant celui cité ci-dessus dit ceci:
Vous devez être prudent lorsque vous définissez la macro.
#define
enregistre les jetons, pas le texte. Le préprocesseur n'a aucun moyen de savoir que la macro sera utilisée comme argument de#include
, donc il génère des jetons ordinaires, pas un nom d'en-tête. Il est peu probable que cela cause des problèmes si vous utilisez des inclusions entre guillemets, qui sont suffisamment proches des constantes de chaîne. Cependant, si vous utilisez des équerres, vous risquez d'avoir des problèmes .
Quelqu'un sait-il quel genre de problème est signalé ici?
la source
Réponses:
Je suppose que l'implémenteur a choisi la manière la plus simple lorsqu'ils ont implémenté cette fonctionnalité, sans y penser beaucoup.
Il semble que la mise en œuvre initiale ait atterri en 2000-07-03 (il y a deux décennies!). La partie pertinente ressemble à ( source ):
Notamment, il éclate lorsqu'il voit le
CPP_GREATER
jeton (c'est-à-dire>
), avant de réserver de la mémoire pour le jeton. Cela a du sens, car il n'est pas nécessaire d'allouer de la mémoire lorsque le jeton ne sera pas écrit dans le tampon.Ensuite, seulement après que la mémoire est réservée, le préprocesseur vérifie si le jeton a le blanc précédent (
t->flags & PREV_WHITE
) et quand il le fait, écrit un caractère blanc dans le tampon.Par conséquent, dans
< foo / bar >
, seuls les espaces avantfoo
(c'est-à-dire après l'initiale<
)/
etbar
sont conservés.la source
if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');
contredit ce qui est dit dans le document: "Tout espace entre les jetons est réduit à un seul espace; ..."?