Errori, bug, domande - pagina 2864

 
Andrey Khatimlianskii:

Allora perché non funziona?

Molto probabilmente questo approccio non funziona da nessuna parte. Perché c'è una sostituzione in corso dove il VALORE a destra è indefinito.

#define  VALUE (VALUE*2)
 
fxsaber:

Questo approccio probabilmente non funziona da nessuna parte. Poiché c'è una sostituzione in corso dove il VALORE a destra è indefinito.

Ed è malvagio cambiare la macro sostituzione di qualcun altro. Tanto più se si tratta di macro d'ambiente predefinite. Non importa dove sarà alla fine la macro di sovrascrittura, dopo che tutti i file del progetto sono stati assemblati. È meglio definire la propria macro _VALUE.
 
Vladimir Simakov:
Sì, ed è malvagio cambiare la macro sostituzione di qualcun altro.

Senza quel male, non sarebbe successo.

 
Vladimir Simakov:
Ed è malvagio cambiare la macro sostituzione di qualcun altro. Soprattutto se sono macro d'ambiente predefinite. Non importa dove alla fine, dopo che tutti i file del progetto sono stati assemblati, apparirà l'override della macro. Fareste meglio a definire la vostra macro _VALUE.
Posso chiedere perché non si può usare l'assegnazione di un valore VALUE a una variabile globale e poi moltiplicarlo e sostituirlo nella definizione finale?
 
Valeriy Yastremskiy:
Posso chiedere perché non si può usare un'assegnazione VALUE a una variabile globale e moltiplicarla e sostituirla nella definizione finale?

Si può, ma allora si perde il senso della sostituzione delle macro (sostituire i valori nel codice). Tutta la speranza rimane sul compilatore, che converte il tipo const (avete, tra l'altro, definito il tipo di variabile?) nel tipo c++ constexpr

Ma per il resto, sì, è possibile.

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

Ma poi, sì, è possibile.

Non funzionerà con quello.

void Func( int = VALUE ) {}
 
fxsaber:

Non funzionerà con questo.

Bene, ancora una volta, chiediamo a constexpr di fare così
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

Questo approccio probabilmente non funziona da nessuna parte. Poiché c'è una tale sostituzione in corso, dove il VALORE a destra non è definito.

A quanto pare, non capisco affatto come funziona il compilatore. Ho immaginato che le stringhe siano analizzate in modo sequenziale. Quindi non c'è nessun valore indefinito a destra:

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
Andrey Khatimlianskii:

A quanto pare, non capisco affatto come funziona il compilatore. Ho immaginato che le stringhe siano analizzate in modo sequenziale. Quindi non c'è nessun valore indefinito a destra:

Funziona dall'alto verso il basso come la sostituzione del testo. Cioè "TMP" sarà sostituito da "VALUE".

 
Andrey Khatimlianskii:

A quanto pare, non capisco affatto come funziona il compilatore. Ho immaginato che le stringhe siano analizzate in modo sequenziale. Quindi non c'è nessun valore indefinito a destra:

Non è il compilatore - è il preprocessore)

#define  VALUE (TMP*2)

si trasforma in

#define  VALUE (VALUE*2)

, e il vostro VALORE è indefinito.