显式C ++宏扩展

时间:2014-08-23 11:27:26

标签: c++ macros c-preprocessor expand

我想让所有日志记录功能都包含文件和行,因此我需要一个宏。 宏以下列方式定义:

 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);

有没有人知道如何首先扩展参数扩展时给出的宏?

2 个答案:

答案 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");