Erreurs, bugs, questions - page 2865

 
fxsaber:

Fonctionne de haut en bas comme un remplacement de texte. C'est-à-dire que "TMP" sera remplacé par "VALUE".

Vladimir Simakov:

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 ?

 
Andrey Khatimlianskii:

Comment undef est censé fonctionner ?

Jusqu'à ce point, il y a un "remplacement de texte" en cours.

 
Vladimir Simakov:

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.

 
fxsaber:

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.

 
Andrey Khatimlianskii:

Cela ne colle pas, change TMP enVALUE dans la ligne "#define VALUE (TMP*2)" qui est après.

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
Et ainsi de suite jusqu'à ce que toutes les substitutions soient terminées.
 
fxsaber:
Et ainsi les substitutions se poursuivent jusqu'à la fin.

Il y a un code :

#define  VALUE 10       // 
#define  TMP VALUE      // 
#undef  VALUE           // 
#define  VALUE (TMP*2)  // 

La première substitution change la VALEUR en 10 dans tout le code jusqu'à #undef VALEUR, laissant ceci :

#define  TMP 10
#define  VALUE (TMP*2)

La substitution suivante fait passer le TMP à 10. Il s'avère que

#define  VALUE (10*2)

Où est-ce que je me trompe ?

 
Andrey Khatimlianskii:

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 :

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

Le préprocesseur insère fidèlement Print

Print((TMP*2));

et ensuite, toujours sans artifice, substitue quoi ? Bien :

Print((VALUE*2));

et ensuite il efface toutes les directives du préprocesseur et seulement après cela le compilateur obtient ceci :

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

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".

 
Andrey Khatimlianskii:

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 :

#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;}

void OnStart(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;}

void OnStart(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 ?

 

Tout est possible, seule une macro doit être ajoutée

#define  VALUE 10

MACRO( VALUE, VALUE2 )

#define  VALUE   VALUE2*2

void f( int i = VALUE ) { Print( i ); }
void OnStart()
{
        f();
}

Résultat : 20