for(x;x<crap;x++)
{
macro(x,y);
}
Comment cela est-il géré par le préprocesseur? Cette boucle est-elle déroulée ou autre chose?Macro en boucle?
for(x;x<crap;x++)
{
macro(x,y);
}
Comment cela est-il géré par le préprocesseur? Cette boucle est-elle déroulée ou autre chose?Macro en boucle?
La macro est développée avant la compilation du code - peu importe que ce soit dans une boucle ou ailleurs.
#define macro(x, y) doSomething(x, y)
for(x;x<crap;x++){
macro(x,y);
}
se dilatent à:
for(x;x<crap;x++){
doSomething(x,y);
}
Le contexte entourant macro(x,y)
n'a pas d'effet sur la façon dont le préprocesseur développe.
(Le préprocesseur ne sait même pas ce langage de programmation que vous utilisez - il pourrait être C, Python, Brainfuck ou une lettre à votre directeur de banque et élargirait les macros de la même façon.)
#define
Les macros peuvent être considérées comme une recherche et un remplacement avant que l'action de compilation ne se produise. Cela signifie que tout ce que votre macro équivaut à sera directement substitué dans sa référence dans votre code. Non, la boucle n'est pas déroulée.
Le préprocesseur _does_ doit savoir quelle langue est utilisée. Avant le remplacement de macro, la source doit être décomposée en jetons de prétraitement, définis par les normes de langage C et C++ et, dans certains cas, différents entre les deux langues. Lors de l'évaluation des directives conditionnelles, si true et false sont traitées comme des valeurs booléennes dépendantes de la langue (elles sont en C++ mais pas en C). Il y a beaucoup d'autres subtilités. –