Возможно ли, чтобы один макрос расширялся по-разному для одного конкретного значения аргумента и по-разному для всех остальных аргументов?
Скажем, я определяю текущего пользователя:
#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
Это возможно?
РЕДАКТИРОВАТЬ :Позвольте мне уточнить. Скажем, каждый программист определяет разные CURRENT_USER
в своем заголовке конфигурации. Я хочу, чтобы пользовательские макросы расширялись до чего-то значимого тогда и только тогда, когда их аргумент user
соответствует CURRENT_USER
. Поскольку я хотел бы, чтобы эти макросы содержали _pragma
, это не может быть проверкой во время выполнения (, как предлагается в некоторых ответах ниже ).
РЕДАКТИРОВАТЬ :Опять же, уточнение. Скажем, есть макрос для отключения оптимизации некоторых участков кода:
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
Некоторые программисты хотят отключить оптимизацию для разных участков кода, но не для всех сразу. Я бы хотел иметь макрос:
#define TURN_OPTIMISATION_OFF(user) /* magic */
Это будет соответствовать аргументу user
макроса CURRENT_USER
, взятому из файла конфигурации программиста -. Если пользователь соответствует макросу, он расширяется до прагмы. Если нет, то ни к чему.