Erreurs, bugs, questions - page 2864

 
fxsaber:

Cette approche ne fonctionne probablement pas partout. Comme il y a une substitution en cours où la VALEUR à droite est indéfinie.

Et c'est mal de changer la macro-substitution de quelqu'un d'autre. D'autant plus s'il s'agit de macros d'environnement prédéfinies. Peu importe l'endroit où se trouvera la macro prioritaire à la fin, une fois que tous les fichiers du projet seront assemblés. Il est préférable de définir votre propre macro _VALUE.
 
Vladimir Simakov:
Oui, et c'est mal de changer la macro-substitution de quelqu'un d'autre.

Sans ce mal, ça ne serait pas arrivé.

 
Vladimir Simakov:
Et c'est mal de changer la macro-substitution de quelqu'un d'autre. Surtout s'il s'agit de macros d'environnement prédéfinies. Peu importe où, à la fin, une fois que tous les fichiers du projet sont assemblés, la surcharge de la macro apparaîtra. Vous feriez mieux de définir votre propre macro _VALUE.
Puis-je vous demander pourquoi vous ne pouvez pas utiliser l'affectation d'une valeur VALUE à une variable globale, puis la multiplier et la substituer dans la définition finale ?
 
Valeriy Yastremskiy:
Puis-je vous demander pourquoi vous ne pouvez pas utiliser une affectation VALUE à une variable globale, la multiplier et la substituer dans la définition finale ?

Vous pouvez le faire, mais alors le sens de la substitution de macro est perdu (substituer des valeurs dans le code). Tout espoir repose sur le compilateur, qui convertit le type const (avez-vous, par ailleurs, défini le type de la variable ?) en type constexpr c++.

Mais sinon, oui, vous pouvez.

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

Mais alors, oui, vous pouvez.

Ça ne marchera pas avec ça.

void Func( int = VALUE ) {}
 
fxsaber:

Ça ne marchera pas avec celui-là.

Bien. Encore une fois, demandons à constexpr de le faire comme ceci
constexpr auto x = 100;

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

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

Cette approche ne fonctionne probablement pas partout. Comme il y a une telle substitution en cours, où la VALEUR à droite n'est pas définie.

Apparemment, je ne comprends pas du tout comment fonctionne le compilateur. J'ai imaginé que les chaînes de caractères sont analysées séquentiellement. Il n'y a donc pas de valeur indéfinie à droite :

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

Apparemment, je ne comprends pas du tout comment fonctionne le compilateur. J'ai imaginé que les cordes sont analysées de manière séquentielle. Il n'y a donc pas de valeur indéfinie à droite :

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

 
Andrey Khatimlianskii:

Apparemment, je ne comprends pas du tout comment fonctionne le compilateur. J'ai imaginé que les cordes sont analysées de manière séquentielle. Il n'y a donc pas de valeur indéfinie à droite :

Ce n'est pas le compilateur - c'est le préprocesseur)

#define  VALUE (TMP*2)

se transforme en

#define  VALUE (VALUE*2)

et votre VALEUR est indéfinie.

 

Il n'est pas possible de créer un nouveau produit pour le marché, le message d'erreur 500 s'affiche.

Le produit a été créé et vérifié, il est indiqué qu'il a été publié, mais lorsque vous cliquez sur le lien, vous obtenez une réponse de 500.

Raison: