我想让所有的日志功能包括文件和行,因此我需要一个宏。宏的定义方式如下:
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);有人知道我怎样才能让作为参数的宏先展开吗?
发布于 2014-08-23 14:14:59
你的日志(.)宏接受变量参数,对它的调用由预处理器解析.它将获取它在大括号中看到的所有内容,并将其作为一个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");发布于 2014-08-23 11:44:32
只需将所有#ifedf放在函数调用之外,并使用它们来定义一些文字字符串。示例:
#ifdef _RELEASE
#define VERSION "RELEASE"
#else
#define VERSION "DEBUG"
#endif
...
LOG(VERSION);
...https://stackoverflow.com/questions/25461426
复制相似问题