我想让所有日志记录功能都包含文件和行,因此我需要一个宏。 宏以下列方式定义:
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);
有没有人知道如何首先扩展参数扩展时给出的宏?
答案 0 :(得分:4)
将所有#ifedf
放在函数调用之外,并使用它们来定义一些文字字符串。
例如:
#ifdef _RELEASE
#define VERSION "RELEASE"
#else
#define VERSION "DEBUG"
#endif
...
LOG(VERSION);
...
答案 1 :(得分:1)
您的Log(...)宏接受可变参数,并且预处理器会对其调用进行解析。它会将它在大括号中看到的所有内容都传递给VA_ARG。
我怀疑这可能是在预处理器中使用省略号的限制。
在C ++中编写Log()函数以避免预处理器解析,或者使用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 DS2
Log(DEBUG_STRING, "Extra1", "extra2");