Я хочу, чтобы все функции ведения журнала включали файл и строку, поэтому мне нужен макрос для этого.
Макрос определяется следующим образом:
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);
Кто-нибудь знает, как я мог бы сделать макросы, заданные в качестве аргумента, в первую очередь раскрытыми?
Ваш макрос 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");
просто положи все #ifedf
s вне вызова функции и использовать их для определения некоторых литеральных строк.
Пример:
#ifdef _RELEASE
#define VERSION "RELEASE"#else
#define VERSION "DEBUG"#endif
...
LOG(VERSION);
...