Возможно ли, чтобы один макрос расширялся по-разному для одного определенного значения аргумента и по-разному для всех остальных аргументов?
Скажем, я определяю текущего пользователя:
#define CURRENT_USER john_smith
То, что я хочу сделать, - это иметь макрос, который будет расширяться по-разному, если пользователь передает совпадения CURRENT_USER
. Имейте в виду, что я не знаю всех возможных пользователей априори. Самый простой случай:
#define IS_CURRENT_USER(user) \
/* this is not valid preprocessor macro */ \
#if user == CURRENT_USER \
1 \
#else \
0 \
#endif
С таким макросом, что каждый другой макрос, основанный на имени пользователя, может быть выполнен следующим образом:
#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
Возможно ли это?
EDIT: Позвольте мне пояснить. Скажем, каждый программист определяет разные CURRENT_USER
в своем заголовке конфигурации. Я хочу, чтобы макросы, специфичные для пользователя, использовали exan для чего-то значимого, если и только если их аргумент user
соответствует CURRENT_USER
. Поскольку я хотел бы, чтобы эти макросы содержали _pragma
, это не может быть проверка времени выполнения (как предложено в некоторых андерсерах ниже).
EDIT: Опять же, разъяснение. Скажем, макрос отключает оптимизацию некоторых разделов кода:
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
Некоторые программисты хотят отключить оптимизацию для разных разделов кода, но не все за один раз. Я хотел бы иметь макрос:
#define TURN_OPTIMISATION_OFF(user) /* magic */
Это будет соответствовать аргументу user
против макроса CURRENT_USER
, взятому из конфигурационного файла для каждого программиста. Если пользователь сопоставляет макрос, он расширяется в прагму. Если нет, то ничего.