2016-04-20 18 views
5

È possibile ridefinire una macro #define in C++ utilizzando le informazioni della macro stessa? Ho provato il codice qui sotto, ma a causa del modo in cui vengono valutate le macro l'output non era quello che mi aspettavo.Come ridefinire una macro #define in C++ utilizzando le informazioni della macro stessa?

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" // Want ABCDEF 

#undef FINAL_DEFINE 
#define FINAL_DEFINE NEW_DEFINE // Want ABCDEF, but get empty? 


int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Want ABCDEF, but doesn't compile. 
} 
+0

Ho aggiornato la domanda per essere più chiara. Fammi sapere se è ancora ambiguo. – Jeff

+0

Fondamentalmente: non è possibile, come spiega la risposta di Chris Dodd. Per risolvere il problema dovrai utilizzare un nome diverso per la definizione intermedia (FINAL_DEFINE sulle prime 2 righe). –

risposta

0

Se il compilatore supporta push_macro & pop_macro direttive pragma, si potrebbe fare questo:

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" 

int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Output ABC 

    #pragma push_macro("FINAL_DEFINE") 
    #define FINAL_DEFINE "XXX" 
    std::cout << NEW_DEFINE << std::endl; // Output XXXDEF 
    #pragma pop_macro("FINAL_DEFINE") 
} 
0

Dopo pre-elaborazione tutto FINAL_DEFINE nel codice sarà sostituito con l'ultimo cosa esso definiti e poi andare alla fase di compilazione.

Quindi non è possibile ridefinire la macro come si desidera.

Il compilatore dovrebbe avvisare.

+0

Il codice è legale. Quale compilatore avviserebbe? –

+0

Attenzione non significa che sia illegale, l'avviso sulla macro ridefinita ti aiuterà molto nel grande progetto quando talvolta gli stessi macro vengono definiti in luoghi diversi. – Nik

+0

OP non definisce MACRO, quindi non ci sono ridefinizioni ... – Jarod42

1

Macro nei corpi macro sono mai espanso quando la macro è definita - solo quando viene utilizzata la macro. Ciò significa che la definizione di NEW_DEFINE è non"ABC" "DEF", è esattamente ciò che appare sulla riga #define: FINAL_DEFINE "DEF".

Quindi, quando si utilizza FINAL_DEFINE, questo viene espanso a NEW_DEFINE che viene quindi espanso a FINAL_DEFINE "DEF". A questo punto, non espanderà ricorsivamente FINAL_DEFINE (poiché ciò porterebbe a un ciclo infinito), quindi non si verificherà più alcuna espansione.