2012-06-19 19 views
6

Lavorando con un framework di test unitario, mi sono imbattuto in una situazione in cui mi piacerebbe testare argomenti macro. Detto semplicemente, mi piacerebbe espandere la macro FOO(x) in modo che FOO(int) sia short e FOO(anything_else) sia long.Posso sostituire condizionatamente gli argomenti del preprocessore?

Con i modelli C++, ovviamente questo non è un problema. Ma qui ho bisogno di una vera sostituzione di token, non solo di uno typedef. Cioè FOO(char) FOO(char) i; dovrebbe essere una definizione valida uguale a long long i;.

+1

Il nuovo standard C ha funzionalità in cui il testo di sostituzione di una macro può dipendere dal tipo di espressione del primo argomento. Potresti usarlo come un blocco di base. –

+0

Hai dato un'occhiata a boost.pp e se puoi hackerare qualcosa insieme a questo? – PlasmaHH

+1

@StefanMajewsky: Ti riferisci a Generics, credo? – dirkgently

risposta

0

quello che stai cercando di fare è impossibile.

Le macro vengono valutate dal preprocessore c, che come dice il nome esegue prima dell'esecuzione del compilatore. Non sa ancora quali sono i tipi dei tuoi simboli.

Perché non si crea una classe per il tipo che si adatta alla cosa giusta nel momento in cui viene valutata dal compilatore.

+0

Non mi importa dei tipi. So che 'int' nella fase di pre-elaborazione è solo un token. Tuttavia, voglio agire condizionatamente sul token 'int'. – MSalters

3

Per quanto ne so, le sole operazioni a stringa disponibili nelle macro C stanno incollando/concatenando i token (usando ##) e stringendoli (usando #).

Sono abbastanza sicuro che il più vicino si sta andando ad ottenere coinvolge enumerare le possibilità in questo modo:

#define FOO(x) FOO__##x 
#define FOO__int short 
#define FOO__short long 
#define FOO__long long 
#define FOO__char long 
// ... for each type you want to replace 

ispirazione da this question.

+0

(Modifica n. 2): se si dispone di un insieme limitato e conosciuto di "els", è possibile elencarli tutti. – flolo

+0

Sì, l'ho capito subito e ho ripulito tutto il post. – vergenzt

+0

Non penso di poter enumerare i miei argomenti in anticipo; Potrei ottenere un 'FOO (AcmeWidgetUnitTest17)' :( – MSalters

Problemi correlati