Especialização de macro de pré-processador C baseada em um argumento
É possível ter uma macro expandida de forma diferente para um valor de argumento específico e diferente para todos os outros argumentos?
Digamos que eu defino um usuário atual:
#define CURRENT_USER john_smith
O que eu quero ser capaz de fazer é ter uma macro que seráexpandido diferentemente se o usuário passasse os jogosCURRENT_USER
. Lembre-se de que não conheço todos os usuários possíveis a priori. O caso mais básico:
#define IS_CURRENT_USER(user) \
/* this is not valid preprocessor macro */ \
#if user == CURRENT_USER \
1 \
#else \
0 \
#endif
Com uma macro como essa, qualquer outra macro que contasse com o nome de usuário poderia ser feita da seguinte maneira:
#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
Isso é possível?
EDIT: Deixe-me esclarecer. Diga que cada programador define diferentesCURRENT_USER
no seu cabeçalho de configuração. Eu quero macros específicas do usuário para exala algo significativo se e somente se o seuuser
jogos de argumentoCURRENT_USER
. Como eu gostaria que essas macros contivessem_pragma
s não pode ser verificação de tempo de execução (como proposto em algumas respostas abaixo).
EDIT: Novamente, esclarecimento. Digamos que haja macro para desativar a otimização de algumas seções do código:
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
Alguns programadores querem desativar a otimização para diferentes seções de código, mas não todas ao mesmo tempo. O que eu gostaria é ter uma macro:
#define TURN_OPTIMISATION_OFF(user) /* magic */
Isso corresponderáuser
argumento contraCURRENT_USER
macro, extraída do arquivo de configuração por programador. Se o usuário corresponder à macro, ela será expandida para o pragma. Se não, para nada.