2012-02-14 24 views
11

Obecnie pracuję na już rozwinięty projekt napisany w MFC C++ i jestem w obliczu problemu z już obecnym makro o definicję:Redefiniowanie lub zmieniając wartość makro

#define HEIGHT_TESTS 13 

Próbuję zmienić wartość z w ramach kodu, ale myślę, że od jego wstępnej definicji, nie jestem w stanie tego zrobić. Czy istnieje sposób, w jaki mógłbym obejść ten problem bez konieczności zmiany oryginalnego makra ogólnego (ponieważ może to wpłynąć na pierwotną funkcjonalność programu). Zamierzam go zmienić w jednym szczególnym warunku, reszta wszędzie jest taka sama.

Po to, aby wszyscy wiedzieli, oczywiście wypróbowałem inną definicję makra z wartością (17), którą zamierzam użyć, ale nie mam szczęścia jako takiego.

Każda pomoc będzie mile widziana.

+0

Polecam posiadanie innego makra do Twojego celu, zamiast #zdefiniowania i przedefiniowania go. – Ajay

+0

Należy pamiętać, że nie będzie możliwe zapisanie istniejącej wartości i jej przywrócenie w celu przywrócenia. Jedynym sposobem na to będzie ponowne zdefiniowanie makra z 13, która jest oczywiście zakodowaną wartością. Jeśli chodzi o odpowiedzi, masz już 2 poniżej, które są poprawne. –

+0

Próbowałem użyć innego makra, ale nie wyszło. Program się zawiesza. To tylko wtedy, gdy zmienię tę konkretną wartość #define, daje mi to właściwy wynik (nie wynik, który zamierzam uzyskać z tym szczególnym warunkiem). – Neophile

Odpowiedz

25

Można undef ine nim i define ponownie:

#include <iostream> 

#define AAA 13 

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

wyjścia: 7

Należy pamiętać, że oświadczenia, które zaczynają się #dyrektywy preprocesora które są pod opieką zanim kod zostanie skompilowany. W takim przypadku ta stała AAA zostanie po prostu zastąpiona przez 7, tzn. Działa podobnie jak tekstowy zamiennik bez dodatkowych kontroli składni, bez zabezpieczeń typu itp.

... co jest głównym powodem, dla którego powinieneś unikać używania makr i #define s gdzie mogą one zostać zastąpione przez funkcje statycznych i zmiennych :)


dlaczego „zamiennik tekstowej”?

Spójrz na ten kod:

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

preprocesor idzie wiersz po wierszu od góry do dołu, w ten sposób:

  • ah, #define AAA 13, więc kiedy uderzy AAA obok czas, umieszczę tam 13
  • wygląd, purePrint używa AAA, jestem r eplacing go 13
  • czekać, teraz mówią mi używać 7, więc będę przestać używać 13
  • więc tutaj w redefAndPrint() włożę tam 7

przekształcania dany kod do tego:

#include <iostream> 

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

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

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

, który wyświetli 13713 i najnowsza #define AAA 4 nie będą w ogóle używane.

+0

Więc możemy ponownie użyć '# undef' i' # define' w dowolnym miejscu w programie? – Neophile

+1

@ Nerds.Dont.Swear: Tak. A kiedy nazwiesz '#undef AAA', nie musisz się nawet martwić, czy wcześniej zdefiniowano' AAA'. – LihO

+0

Masz na myśli zdefiniowane * :) – Neophile

4

coś jak następuje:

#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 17 

// Use redefined macro 

// Restore 
#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 13