Специализация макроса препроцессора C на основе аргумента

Возможно ли, чтобы один макрос расширялся по-разному для одного конкретного значения аргумента и по-разному для всех остальных аргументов?

Скажем, я определяю текущего пользователя:

#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, взятому из файла конфигурации программиста -. Если пользователь соответствует макросу, он расширяется до прагмы. Если нет, то ни к чему.

15
задан AstroCB 2 November 2014 в 18:56
поделиться