2010-06-21 11 views
8

Załóżmy, że mam następujące makro:Jak przedefiniować makro używając jego poprzednią definicję

#define xxx(x) printf("%s\n",x); 

Teraz w niektórych plików, które chcę użyć „lepszą” wersję tego makra bez zmiany jej nazwy. Nowa wersja bada funkcjonalność oryginalnej wersji i wykonuje więcej pracy.

To oczywiście daje mi ostrzeżenie o przerobie, ale dlaczego "xxx" nie zostało zadeklarowane w tym zakresie? Jak powinienem go poprawnie zdefiniować?

EDIT: według tego http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html powinno być możliwe

+1

To strona makra autoreferencyjna opisuje zasady zapobieganie nieskończonej rekursji zastępowania makr. Nie oznacza to, że można zdefiniować makro, które oznacza więcej niż jedną rzecz. –

Odpowiedz

0

To nie jest dokładnie to, o co prosisz, ale za to może pomóc.

Przed dodaniem nowej definicji można uzyskać makro o wartości od #undef.

Przykład:

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) whatever 

Nigdy nie słyszałem (lub widział) rekurencyjny makro choć. Nie sądzę, że to możliwe.

+2

Zauważ, że blok '# ifdef' nie jest potrzebny. Możesz użyć '# undef' na nazwie, aby nie zdefiniować go jako makra, nawet jeśli ta nazwa nie jest obecnie zdefiniowana jako makro. Możesz więc po prostu '#undef xxx', a następnie' #define xxx ... '. –

+0

@James McNellis: Dobrze wiedzieć. Dzięki! – ereOn

6

Niemożliwe. Makra mogą korzystać z innych makr, ale używają definicji dostępnej w czasie rozwijania, a nie czasu definicji. A makra w C i C++ nie mogą być rekurencyjne, więc xxx w twoim nowym makrze nie jest rozwinięty i jest traktowany jako funkcja.

3

Nie można ponownie użyć starej definicji makra, ale można ją zmienić i wprowadzić nową definicję. Mam nadzieję, że kopiowanie i wklejanie nie będzie zbyt skomplikowane.

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) printf("%s\n",x); 

Moje zalecenie jest zdefiniowanie makro xxx2.

#define xxx2(x) do { xxx(x); yyy(x); } while(0); 
+3

Należy zauważyć, że blok '# ifdef' nie jest potrzebny. Możesz użyć '# undef' na nazwie, aby nie zdefiniować go jako makra, nawet jeśli ta nazwa nie jest obecnie zdefiniowana jako makro. Możesz więc po prostu '#undef xxx', a następnie' #define xxx ... '. –

+0

Cool! Nie wiedziałem o tym. Opuszczenie '# ifdef' sprawia, że ​​kod jest bardziej czytelny. – Mike

+0

Mam Prefix projektu. Gdzie ustawiam wartości domyślne, które są wspólne dla aplikacji z moich aplikacji, a następnie mają prefiks specyficzne dla aplikacji dla rzeczy, które się zmieniają. Kiedy zmieniłem definicję makra, otrzymałem ostrzeżenie "Makro Lexical lub Preprocessor Issue redefined" i nie mogłem wymyślić sposobu wyłączenia tego ostrzeżenia w preprocesorze. #undef PLAY_BUTTON_TITLE, a następnie #define PLAY_BUTTON_TITLE @ "Start" pomija błąd i przedefiniowuje przycisk. – JScarry

2

Jeśli znamy typ parametru "x" w makrze "xxx", możemy przedefiniować makro, używając go w funkcji, a następnie zdefiniować makro "xxx" jako funkcję

Oryginalna definicja dla „XXX” makro:

#define xxx(x) printf("xxx %s\n",x); 

w pewnym make plik udoskonalona wersja „xxx” makro:

/* before redefining the "xxx" macro use it in function 
* that will have enhanced version for "xxx" 
*/ 
static inline void __body_xxx(const char *x) 
{ 
    xxx(x); 
    printf("enhanced version\n"); 
} 

#undef xxx 
#define xxx(x) __body_xxx(x) 
Powiązane problemy