Forse provare qualche espansione macro multistadio? Questa è la strategia utilizzata da Boost preprocessor/control/if library.
#define FOO_NAME 1
#define FOO__ 2
#define CONC(a,b) a##_##b
#define FOO(x) CONC(FOO,x)
Non penso ci sia alcun modo per verificare le condizioni all'interno di un'espansione macro C.
La cosa migliore che potrei inventare è di nascondere gli argomenti macro a una stringa letterale usando l'operatore di stringaggio #
e quindi controllando l'utilizzo delle funzioni di runtime. (Questo non funziona per il vostro caso, però, in cui si desidera dichiarazioni di variabili di output.)
Per esempio, i seguenti stampe "011":
#define FOO(x) (strcmp("NAME", #x) ? 1 : 0)
main()
{
printf("%d", FOO(NAME));
printf("%d", FOO(1));
printf("%d", FOO(2));
}
Il compilatore probabilmente ottimizzare i strcmp
confronti in fase di compilazione quindi non sarebbe più inefficiente di quanto sarebbe stato se fossero disponibili veri condizionali pre-processore. Tuttavia, rendendo FOO
una funzione normale sarebbe più chiara e probabilmente altrettanto efficiente.
fonte
2013-09-25 17:19:20
I macro sono fantastici. –
Puoi spiegare lo scopo, o forse dare un esempio migliore? Il parametro dovrebbe essere corretto in fase di compilazione, il che significa che potresti anche usare due diversi nomi di macro. – lurker
@mbratch: In questo caso particolare, sto usando una macro per definire un insieme di variabili ma alcune variabili sono facoltative e voglio evitare di definirle. I nomi di macro multipli non funzionerebbero bene a causa di un'esplosione combinatoria: con due nomi variabili avrei bisogno di macro separate per 'foo (a, b)', 'foo (a, _)', 'foo (_, b)' e ' foo (_, _) '. – hugomg