Question

je veux enregistrer quelque chose si plusieurs fois, j'utilise #define pour cette annonce, je veux l'utiliser mais ça ne marche pas

#define CHECK_CONDITION(QString condition, start, curr) if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

et je l'utilise comme ceci :

if(CHECK_CONDITION(table.commonIn().toStdString(), start, start-idx);) {
   findFalse = true;
}

Comment puis-je utiliser cette définition dans mon code / merci d'avance

Était-ce utile?

La solution

Vous pouvez utiliser cette macro modifiée:

#define CHECK_CONDITION(condition, start, curr) \
    if(condition == "" || (condition == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

L'erreur que vous avez faite dans cette macro:

  • spécifiant qstring pour la condition

  • retour, car cela n'aura pas la logique de "valeur de retour de macro", mais retournera réellement dans la fonction winder. En effet, il doit passer par l'étape du préprocesseur.

  • Vous n'avez pas besoin de branches distinctes dans la macro comme un simple logique ou ("||") peut le faire.

  • Vous avez utilisé la table courante dans String Getter dans la macro même si vous avez déjà passé la variable de condition.

  • J'utiliserais la barre arrière pour la faire scinder en morceaux pour une meilleure lisibilité.

Et puis vous pouvez garder le reste de votre code comme celui-ci:

if(CHECK_CONDITION(table.commonIn(), start, (start-idx))) {
   findFalse = true;
}

Les erreurs ici que vous avez faite:

  • Vous avez eu un point-virgule inutile dans la condition IF qui est invalide syntaxe C ++.

  • Vous pouvez entrer dans des problèmes en général (pas ici) sans mettre la soustraction en support.

  • Il serait plus propre si vous pouviez créer deux variables distinctes pour la chaîne et l'entier actuel avant l'appel de macro à check_condition, comme illustré ci-dessous.

  • Vous passez à STD :: string plutôt que qstring.

Mais ce serait encore plus agréable si vous pouviez simplement la deuxième partie comme celle-ci:

QString myString = table.commonIn();
int curr = start - idx;

if(CHECK_CONDITION(myString, start, curr)) {
   findFalse = true;
}

Disclaimer: J'essaie de faire fonctionner votre macro et votre appelant, mais en général, essayez d'éviter les macros lorsque cela est possible.

Il y a des cas où ils ont du sens, mais il existe des alternatives telles que le modèle (qui n'est pas applicable ici) ou des fonctions et des méthodes intégrées (non sûre si applicable ici). En fonction de votre cas d'utilisation, vous pouvez ramasser selon vos préférences, mais vous pouvez obtenir le point de cette réponse comment faire fonctionner la macro de votre cas d'utilisation.

Autres conseils

Le préprocesseur n'a aucune notion de types, donc lorsque vous déclarez un #define avec les types, vous n'avez pas besoin de spécifier le type de paramètre :

#define CHECK_CONDITION(condition, start, curr) { if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}

D'ailleurs, un #define est étendu là où vous l'utilisez (le préprocesseur remplace CHECK_CONDITION avec ce bloc de code), donc votre code ne sera pas compilé pour au moins une raison :vous nicherez un if à l'intérieur d'un if condition, ce qui est une erreur de syntaxe.

Utilisez plutôt une fonction (peut-être en ligne):

inline
bool check_condition(QString condition, int start, int curr) {
    if(condition == "" ) return true;
    return (
        table.commonIn() == "team_id"?
            list()[start]->team() == list()[curr]->team():
            list()[start]->team() == list()[curr]->team()
    )
}

Cela rend également explicite ici une possible erreur de syntaxe :Je ne sais pas ce que vous vouliez dire avec les deux dernières lignes, alors je n'y ai pas touché...

Mes 2cents :vous devriez voir le préprocesseur en C++ en dernier recours :vous avez des modèles, des variables const et des fonctions en ligne.

La principale raison pour laquelle il a été laissé en C++ (au lieu d'utiliser un include mot-clé seul ou similaire) est de conserver une compatibilité ascendante avec C.N'utilisez jamais le préprocesseur, à moins qu'une autre solution ne soit trop complexe.

UN #define en C/C++ est une définition de macro qui est un simple remplacement textuel.Cette définition ressemble plus à une fonction et tente d'attribuer un type à l'un des paramètres.Ce n'est pas une syntaxe légale et donc le QString une partie doit être retirée

Dans l’ensemble, ce code n’est pas idéal pour une macro.Les arguments start et curr sont tous deux utilisés plusieurs fois dans l’extension.Cela signifie que si une expression à effet secondaire est transmise à la macro, elle sera potentiellement exécutée plusieurs fois.Une fonction serait bien plus appropriée ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top