web-dev-qa-db-fra.com

Redéfinir ou changer la valeur macro

Je travaille actuellement sur un projet déjà développé écrit dans MFC C++ et je suis confronté à un problème avec une macro déjà présente avec la définition:

#define HEIGHT_TESTS 13

J'essaie de changer la valeur de l'intérieur du code, mais je pense que depuis sa définition prétraitée, je suis incapable de le faire. Existe-t-il un moyen de contourner ce problème sans avoir à modifier l'ensemble de la macro originale (car cela pourrait affecter la fonctionnalité d'origine du programme). Je n'ai que l'intention de le changer en une condition particulière, reposez-vous partout où il reste le même.

Juste pour que tout le monde sache, j'ai évidemment essayé d'utiliser une définition macro différente avec la valeur (17) que j'ai l'intention d'utiliser, mais pas de chance en tant que telle.

Toute aide serait très appréciée.

16
Neophile

Vous pouvez undefine it et define à nouveau:

#include <iostream>

#define AAA 13

int main()
{
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

sorties: 7

Veuillez noter que les instructions commençant par # Sont directives de préprocesseur qui sont pris en charge avant même que le code soit même compilé. Dans ce cas, cette constante AAA sera simplement remplacée par 7, C'est-à-dire comme un remplacement textuel sans vérification supplémentaire de syntaxe, sans type de sécurité, etc.

... qui est la principale raison pour laquelle vous devriez éviter d'utiliser des macros et #define S où ils peuvent être remplacés par des fonctions statiques et des variables :)


Pourquoi "remplacement textuel" ?

Regardez ce code:

#include <iostream>

#define AAA 13

void purePrint() {
    std::cout << AAA;
}

void redefAndPrint() {
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

int main()
{
    #undef AAA
    #define AAA 4
    purePrint();
    redefAndPrint();
    purePrint();
}

le préprocesseur va ligne par ligne de haut en bas, ce faisant cela:

  • ah, #define AAA 13, alors quand je frappe AAA la prochaine fois, je vais y installer 13
  • look, pureprint utilise AAA, je le remplace par 13
  • Attendez, maintenant, ils me disent d'utiliser 7, donc je vais arrêter d'utiliser 13
  • Alors ici dans redefAndPrint() je vais y installer 7

transformer le code donné dans celui-ci:

#include <iostream>

void purePrint() {
    std::cout << 13;
}

void redefAndPrint() {
    std::cout << 7;
}

int main()
{
    purePrint();
    redefAndPrint();
    purePrint();
}

qui va sortir 13713 et le dernier #define AAA 4 Ne sera utilisé pas du tout.

31
LihO

Quelque chose comme ce qui suit:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
4
hmjd

#define a 2

#define B (A + 3)

#define c (B + 4)

// Je veux ici pour changer la valeur de A - possible?

#define A (C + 6)

0
UJJAL