Ce n'est pas un compilateur - c'est un préprocesseur)
se transforme en
et la VALEUR est indéfinie.
#define VALUE (VALUE*2)
Si je comprends bien, le type de valeur VALUE*2 est const et est lié à la substitution elle-même, c'est-à-dire que la VALUE est également une constante. Le compilateur crée deux constantes.
Si c'est le cas, il doit créer une nouvelle substitution.
#define VALUE1 (VALUE*2)
#define VALUE VALUE1
Et ce n'est pas correct si la VALEUR au-dessus du code a été définie comme une constante.
Désolé, je me suis embrouillé en essayant de m'expliquer))))
Encore une fois :
#define VALUE 10#define TMP VALUE
#undef VALUE
#define VALUE (TMP*2)
Au moment de la deuxième définition de VALEUR, la macro VALEUR n'est pas définie, et VALEUR est donc définie comme suit
(VALUE*2)
parce que le TMP était et est toujours défini par la VALEUR.
Mais le TMP, après la deuxième définition de la VALEUR, est étendu à
(TMP*2)
(Quelque chose comme ça))
Le préprocesseur ne fait que remplir ce qu'il a et peu importe comment et où il est défini. C'est pourquoi vous devez être prudent avec elle. Exemple :
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x) {return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b))); //400
}
et ajoutons maintenant une chose maléfique à la fonction, à savoir un effet secondaire
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x){
Print("Увидивший это второй раз - нубяра vulgaris");
return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b)));
}
Et ce n'est qu'une inscription, mais que faire si le dépôt dépend de cette fonction ?
Fonctionne de haut en bas comme un remplacement de texte. C'est-à-dire que "TMP" sera remplacé par "VALUE".
Ce n'est pas un compilateur - c'est un préprocesseur)
se transforme en
et la VALEUR n'est pas définie.
Comment undef est censé fonctionner ?
Comment undef est censé fonctionner ?
Jusqu'à ce point, il y a un "remplacement de texte" en cours.
Ce n'est pas un compilateur - c'est un préprocesseur)
se transforme en
et la VALEUR est indéfinie.
Si je comprends bien, le type de valeur VALUE*2 est const et est lié à la substitution elle-même, c'est-à-dire que la VALUE est également une constante. Le compilateur crée deux constantes.
Si c'est le cas, il doit créer une nouvelle substitution.
#define VALUE VALUE1Et ce n'est pas correct si la VALEUR au-dessus du code a été définie comme une constante.
Jusqu'à ce stade, il s'agit d'un "remplacement de texte".
Ne correspond pas, change TMP enVALUE dans la ligne "#define VALUE (TMP*2)" qui est après.
Cela ne colle pas, change TMP enVALUE dans la ligne "#define VALUE (TMP*2)" qui est après.
Et ainsi les substitutions se poursuivent jusqu'à la fin.
Il y a un code :
La première substitution change la VALEUR en 10 dans tout le code jusqu'à #undef VALEUR, laissant ceci :
La substitution suivante fait passer le TMP à 10. Il s'avère que
Où est-ce que je me trompe ?
Il y a un code :
La première substitution change la VALEUR en 10 dans tout le code jusqu'à #undef VALEUR, laissant ceci :
La substitution suivante fait passer le TMP à 10. Il s'avère que
Qu'est-ce que je fais de mal ?
Ce n'est pas 10 qui est substitué à TMP, c'est la VALEUR, mais si la VALEUR est définie (ce qui est casse-gueule), c'est 10.
Regardez ça étape par étape :
Le préprocesseur insère fidèlement Print
et ensuite, toujours sans artifice, substitue quoi ? Bien :
et ensuite il efface toutes les directives du préprocesseur et seulement après cela le compilateur obtient ceci :
TMP n'est pas 10, mais VALUE est substitué à TMP, et ensuite si VALUE est défini (ce qui est un problème), il est 10
Regardez ça étape par étape :
Le préprocesseur insère fidèlement Print
et ensuite, toujours sans artifice, substitue quoi ? Bien :
et ensuite il efface toutes les directives du préprocesseur et seulement après cela le compilateur obtient ceci :
Cela ne s'appelle pas "top-down".
On ne dit pas que c'est du haut vers le bas.
Désolé, je me suis embrouillé en essayant de m'expliquer))))
Encore une fois :
Au moment de la deuxième définition de VALEUR, la macro VALEUR n'est pas définie, et VALEUR est donc définie comme suit
(VALUE*2)parce que le TMP était et est toujours défini par la VALEUR.
Mais le TMP, après la deuxième définition de la VALEUR, est étendu à
(TMP*2)(Quelque chose comme ça))
Le préprocesseur ne fait que remplir ce qu'il a et peu importe comment et où il est défini. C'est pourquoi vous devez être prudent avec elle. Exemple :
et ajoutons maintenant une chose maléfique à la fonction, à savoir un effet secondaire
Et ce n'est qu'une inscription, mais que faire si le dépôt dépend de cette fonction ?
Tout est possible, seule une macro doit être ajoutée
Résultat : 20