显式c++宏扩展

Explicit C++ Macro Expansion

本文关键字:扩展 c++ 显式      更新时间:2023-10-16

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

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

有没有人知道我如何使宏作为参数首先展开?

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

#ifdef _RELEASE 
#define VERSION "RELEASE"
#else 
#define VERSION "DEBUG"
#endif
...
LOG(VERSION);    
...

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