2012-12-12 21 views
9

Un codice legacy su cui sto lavorando ha una macro che restituisce una lista separata da virgole che deve essere utilizzata come argomento di funzione. Questo è brutto, ma il file di configurazione contiene molti di questi e sarebbe difficile cambiare ora.Separazione degli argomenti nel preprocessore C++

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

Questo funziona benissimo fintanto che si chiama una funzione. Tuttavia, quando si cerca di chiamare un'altra macro con i parametri, l'intera stringa viene considerato come un argomento piuttosto che di divisione in virgola in due argomenti

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

C'è una soluzione per questo problema senza modificare le definizioni XY?

+2

/me scuote il primo codice legacy – icabod

+1

Ho trovato una discussione o questo problema nel manuale GCC: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

risposta

13

Kinda. Le seguenti opere:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT(xy) 
#define XY x,y 
MAC_POINT(x,y) 
MAC_POINT1(XY) 

Tuttavia, si devono cambiare da MAC_POINT a MAC_POINT1 se si dispone di un solo argomento.

Un'altra possibilità è questa:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

Ora è necessario cambiare tutte le chiamate alla macro, ma almeno sono coerenti.

+0

Ah, I penso di vedere perché è necessario il livello extra di indirezione. Grazie! – Quantum7

Problemi correlati