Явное расширение макроса C ++

Я хочу, чтобы все функции ведения журнала включали файл и строку, поэтому мне нужен макрос для этого.
Макрос определяется следующим образом:

 inline void _internLogFunc(int line, const char* function, const char* data ...)
{...}

#define _InternLogParams(...) _internLogFunc(__LINE__, __FUNC__, __VA_ARGS__)

#define Log(...) _InternLogParams(__VA_ARGS__)

Проблема в том, что когда функция вызывается следующим образом:

 Log("[Version]: "#if defined(_RELEASE)
"RELEASE "#elif defined(_PROFILE)
"PROFILE "#else
"DEBUG "#endif

#if defined(PURE_CLIENT)
"PURE CLIENT"#elif (DEDICATED_SERVER)
"DEDICATED SERVER"#else
"DEVELOPMENT BUILD"#endif
);

Макросы расширяются до следующего:

> _internLogFunc(950,
>                __FUNCTION__  ,
>                "[Version]: ">                #if defined(_RELEASE) "RELEASE ">                #elif defined(_PROFILE) "PROFILE ">                #else "DEBUG ">                #endif
>                #if defined(PURE_CLIENT) "PURE CLIENT">                #elif (DEDICATED_SERVER) "DEDICATED SERVER">                #else "DEVELOPMENT BUILD">                #endif);

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

1

Решение

Ваш макрос Log (…) принимает переменные аргументы, и его вызов обрабатывается препроцессором. Он возьмет все, что видит в скобках, и передаст его как VA_ARG.

Я подозреваю, что это может быть ограничением использования многоточия в препроцессоре.

Напишите функцию Log () в C ++, чтобы избежать подобного анализа препроцессором, или используйте макросы вне вызова Log () для построения строки, которую вы хотите вывести.

Например:

#if defined(_RELEASE)
#define DS1 "RELEASE "#elif defined(_PROFILE)
#define DS1 "PROFILE "#else
#define DS1 "DEBUG "#endif

#if defined(PURE_CLIENT)
#define DS2 "PURE CLIENT"#elif defined (DEDICATED_SERVbER)
#define DS2 "DEDICATED SERVER"#else
#define DS2 "DEVELOPMENT BUILD"#endif

#define DEBUG_STRING "[Version]: " DS1 DS2Log(DEBUG_STRING, "Extra1", "extra2");
1

Другие решения

просто положи все #ifedfs вне вызова функции и использовать их для определения некоторых литеральных строк.
Пример:

#ifdef _RELEASE
#define VERSION "RELEASE"#else
#define VERSION "DEBUG"#endif

...

LOG(VERSION);

...
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector