Especialización en macros de preprocesador C basada en un argumento
¿Es posible tener una macro expandida de manera diferente para un valor de argumento específico y de manera diferente para todos los demás argumentos?
Digamos que defino un usuario actual:
#define CURRENT_USER john_smith
Lo que quiero poder hacer es tener una macro que seráexpandido diferente si el usuario pasa coincidenciasCURRENT_USER
. Tenga en cuenta que no conozco todos los posibles usuarios a priori. El caso más básico:
#define IS_CURRENT_USER(user) \
/* this is not valid preprocessor macro */ \
#if user == CURRENT_USER \
1 \
#else \
0 \
#endif
Con una macro como esa, cualquier otra macro que se base en el nombre de usuario podría hacerse de la siguiente manera:
#define SOME_USER_SPECIFIC_MACRO(user) SOME_USER_SPECIFIC_MACRO_SWITCH_1(IS_CURRENT_USER(user))
#define SOME_USER_SPECIFIC_MACRO_SWITCH_1(switch) SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) // expand switch ...
#define SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) SOME_USER_SPECIFIC_MACRO_##switch // ... and select specific case
#define SOME_USER_SPECIFIC_MACRO_0 ... // not current user
#define SOME_USER_SPECIFIC_MACRO_1 ... // current user
es posible?
EDIT: Déjame aclarar. Digamos que cada programador define diferenteCURRENT_USER
en su encabezado de configuración. Quiero que las macros específicas del usuario se extiendan a algo significativo si y solo si suuser
coincidencias de argumentosCURRENT_USER
. Como me gustaría que contengan esas macros_pragma
s no puede ser una verificación de tiempo de ejecución (como se propone en algunas de las siguientes respuestas).
EDIT: Una vez más, la aclaración. Digamos que hay una macro para deshabilitar la optimización de algunas secciones de código:
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
Algunos programadores desean desactivar la optimización para diferentes secciones de código, pero no todas al mismo tiempo. Lo que me gustaría es tener una macro:
#define TURN_OPTIMISATION_OFF(user) /* magic */
Que va a coincidiruser
argumento en contraCURRENT_USER
Macro, tomada del archivo de configuración por programador. Si el usuario coincide, la macro se expande en pragma. Si no, a la nada.