首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显式C++宏展开

显式C++宏展开
EN

Stack Overflow用户
提问于 2014-08-23 11:27:26
回答 2查看 356关注 0票数 1

我想让所有的日志功能包括文件和行,因此我需要一个宏。宏的定义方式如下:

代码语言:javascript
复制
 inline void _internLogFunc(int line, const char* function, const char* data ...)
    {...}

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

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

问题是,当以下列方式调用该函数时:

代码语言:javascript
复制
 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
                );

宏扩展到以下内容:

代码语言:javascript
复制
> _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);

有人知道我怎样才能让作为参数的宏先展开吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-23 14:14:59

你的日志(.)宏接受变量参数,对它的调用由预处理器解析.它将获取它在大括号中看到的所有内容,并将其作为一个VA_ARG传递。

我怀疑这可能是在预处理器中使用省略号的限制。

在C++中编写Log()函数,以避免以这种方式进行预处理器解析,或者在Log()调用之外使用宏来构建要输出的字符串。

例如:

代码语言:javascript
复制
#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");
票数 1
EN

Stack Overflow用户

发布于 2014-08-23 11:44:32

只需将所有#ifedf放在函数调用之外,并使用它们来定义一些文字字符串。示例:

代码语言:javascript
复制
#ifdef _RELEASE 
#define VERSION "RELEASE"
#else 
#define VERSION "DEBUG"
#endif

...

LOG(VERSION);    

...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25461426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档