Symbol preprocesora to nazwa. Nie ma dyrektywy o preprocesorze, która zmienia samą nazwę, zachowując jej zawartość.Na przykład, biorąc pod uwagę zarówno:
#define FOO 42
lub
#define FOO(x, y) x ## y (
Nie ma sposobu, aby zdefiniować makro o nazwie BAR
, który ma te same treści, bez powtarzania tych definicji. To znaczy, nie ma operacji, takich jak:
#alias BAR FOO // nonexistent fantasy macro-cloning preprocessor directive
Nor tak:
#rename BAR FOO // like #alias BAR FOO followed by #undef FOO
Jeśli robimy to:
#define BAR FOO // for the #define FOO 42 case
nie jest aliasem. Makro BAR
jest zdefiniowane w taki sposób, że jego zastępczą sekwencją tokenów jest token FOO
, a nie 42
. Jeśli makro FOO
zniknie, oznacza to, że BAR
traci znaczenie.
Zauważ też, że makra preprocesora C nie można rozwinąć do dyrektyw preprocesora, więc następujące podejście również nie zadziała:
// wrong:
#define MACRO_DEFINER(NAME) \
#define NAME 42
MACRO_DEFINER(FOO) // hoping for #define FOO 42: no such luck
MACRO_DEFINER(BAR) // hoping for #define BAR 42: likewise
Obawiam się, że trzeba podjąć kilka kroków, aby znaleźć alternatywna strategia do dowolnego problemu, który próbujesz rozwiązać. Jeśli utkniesz, stwórz nowe pytanie o rzeczywisty problem.
Zawsze jest generowanie kodu: generowanie C lub C++ w czasie kompilacji. Wtedy możliwe jest wymienianie tekstu lub ekspansja, o jakiej można marzyć, jeśli tylko dostroisz system generowania.
Myślę, że utknąłeś, jeśli chcesz uzyskać definicję LIB_XYZ z pliku nagłówkowego strony trzeciej i nie chcesz używać niczego poza kompilatorem C. Gdybym musiał to zrobić, prawdopodobnie napiszę skrypt, by przekształcić lib.h w our_lib.h, z wybranymi # define's modified, make my code include our_lib.h, i użyj makefile, aby uczynić właściwą rzecz, jeśli lib .h zmieniony. –
Być może [this] (http://stackoverflow.com/questions/1793800/can-i-redefine-a---chem-then-define-it-back) może pomóc. –