2012-02-14 13 views
11

Attualmente sto lavorando su un progetto già sviluppato scritto in MFC C++ e sono di fronte a un problema con una già presente macro con la definizione:Ridefinizione o la modifica macro valore

#define HEIGHT_TESTS 13 

Sto cercando di modificare il valore da all'interno del codice ma penso che dal momento che è una definizione preelaborata, non sono in grado di farlo. C'è un modo per aggirare questo problema senza dover modificare la macro originale in generale (in quanto potrebbe influire sulla funzionalità originale del programma). Sto solo cercando di cambiarlo in una condizione particolare, resto ovunque rimane lo stesso.

Solo per far sapere a tutti, ho ovviamente provato a utilizzare una definizione di macro diversa con il valore (17) che intendo utilizzare, ma senza fortuna in quanto tale.

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Si consiglia di avere un'altra macro per il proprio scopo, piuttosto che #undefining e ridefinirla. – Ajay

+0

Si noti che non sarà possibile salvare il valore esistente e ripristinarlo, se è necessario ripristinarlo. L'unico modo per te sarà ridefinire la macro con 13 che ovviamente è un valore hard coded. Per quanto riguarda le risposte, hai già 2 sotto che sono corrette. –

+0

Ho provato a utilizzare una macro diversa, ma non ha funzionato. Il programma si blocca. E 'solo quando cambio questo particolare valore #define, mi dà un risultato corretto (non il risultato che intendo ottenere con questa particolare condizione). – Neophile

risposta

25

È possibile undef ine e define ancora:

#include <iostream> 

#define AAA 13 

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

uscite: 7

Si prega di notare che le dichiarazioni che iniziano con # sono direttive preprocessore di cui ci si occupa prima che il codice sia stato compilato. In questo caso, questa costante AAA sarà semplicemente sostituita da 7, cioè funziona come una sostituzione testuale senza ulteriori controlli di sintassi, nessun tipo di sicurezza ecc ...

... che è il motivo principale per cui dovresti evitare l'uso di macro e #define s dove possono essere sostituiti da funzioni statiche e variabili :)


Perché "la sostituzione del testo"?

Guardate questo codice:

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

preprocessore va riga per riga dall'alto verso il basso, facendo questo:

  • ah, #define AAA 13, così quando ho colpito AAA prossimo tempo, ci metto li 13
  • look, purePrint utilizza AAA, I'm r eplacing con 13
  • attesa, ora mi dicono di utilizzare 7, quindi dovrò smettere di usare 13
  • ecco in redefAndPrint() metterò lì 7

trasformando il dato il codice in questo:

#include <iostream> 

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

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

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

che emetterà 13713 e l'ultimo #define AAA 4 non saranno usati affatto.

+0

Quindi, possiamo usare '# undef' e' # define' di nuovo ovunque nel programma? – Neophile

+1

@ Nerds.Dont.Swear: Sì. E quando chiami '#undef AAA', non devi nemmeno preoccuparti se prima era stato definito' AAA'. – LihO

+0

Vuoi dire definito * :) – Neophile

4

qualcosa di simile al seguente:

#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 17 

// Use redefined macro 

// Restore 
#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 13