2013-01-10 15 views
13

Muszę tymczasowo zastąpić makro, a następnie przywrócić je. Na przykład:Tymczasowe nadpisanie makra w preprocesorze C

#define FOO X 
#save FOO 
#define FOO Y 
... 
#restore FOO 

Czy to możliwe w standardowym preprocesorze C? W GCC?

ADDED. O prawdziwym przykładzie świata. Używam globalnego makra dla wyjątku błędu. Działa jak assert, ale do trwałego użytkowania, nie tylko dla wersji debugowania; więc na przykład zwykle wywołuję funkcje (z efektem ubocznym) wewnątrz makra. Jest zdefiniowany raz, ale definicja nie jest trwała; dlatego nie znam tego a priori. Dla jakiegoś kawałka kodu potrzebuję jego własnej, zmodyfikowanej wersji makra, ale chcę, aby zapisał ogólny styl kodu. Wygląda to paskudnie, gdy jedna część kodu używa jednego makro, druga część używa innego makra - oba makra mają ten sam cel , ale nieco inną implementację.

Dobrze, że tymczasowo zapisuję oryginalne makro, używam innej wersji dla części kodu, po tym przywracam oryginalne makro.

+0

Chyba że wiesz dokładnie, co 'foo 'jest przed i po, nie, to nie jest możliwe. –

+2

Dlaczego nie wystarczy zmienić nazwy makr? Wydaje się dużo prostsze. –

+1

Nie mam pewności co do zwykłego C, ale w języku C++ można użyć funkcji push_macro: http://stackoverflow.com/questions/1543736/how-do-i-temporarily-disable-a-macro- expansion- in -cc –

Odpowiedz

4

Jak już mówiłem, to nie jest to możliwe. W zależności od sytuacji, może to być obejście:

#include "generalmacrodefs.h" // put them in here or include them indirectly 
#undef macro1 
#define macro1 "specialized temporary value" 
#undef macro1 
#include "generalmacrodefs.h" // restores 

Wymaga to generalmacrodefs.h wykorzystuje wzór takiego przynajmniej dla definicji można tymczasowo nadpisać:

#ifndef macro1 
#define macro1 "original value" 
#endif 
1

Najbliżej można przyjść w C jest dyrektywa #undef, który po prostu undefines makra, by mógł on być zastąpiony:

#define FOO X 

... 

#undef FOO 
#define FOO Y 

... 

#undef FOO 
#define FOO X 

Problem polega na tym, że nie można poznać „starych” wartości FOO raz przedefiniujesz to - twoje wartości muszą być zakodowane w jednym miejscu.

Nie można tworzyć makra, aby zapisać wartości dla ciebie albo, jak to nie jest możliwe, aby mieć makro, które tworzy inne dyrektywy preprocesora w standardzie C

+0

nie znam starej wartości 'FOO' lub może mieć zbyt dużą definicję. –

+0

@ user14284 to masz szczęście. W tym przypadku nie ma rozwiązania w C. Czy istnieje jakiś szczególny powód, dla którego nie można zmienić nazwy makra? –

+0

Może jest rozwiązanie z GCC? A co masz na myśli w "re-name"? –