3

我运行cl/P test.cpp,文件和结果如下。Visual studio __VA_ARGS__问题

TEST.CPP

#define FiltedLog(...) \ 
    if (logDetail) \ 
     MP_LOG(LOG_INFO, __VA_ARGS__); 

#define MP_LOG(level,fmt,...) \ 
    BOOAT::LOG("MP", level, fmt, ##__VA_ARGS__) 

#define LOG(tag,level,fmt,...) \ 
    Log::log(tag, level, "%s: " fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__) 

int main() 
{ 
    FiltedLog ("abc", 1, 2); 
} 

氯/ P TEST.CPP:

但不知为何,__PRETTY_FUNCTION__被放置在结果的最后一个参数。 我假设结果应该是:

if (logDetail) BOOAT::Log::log("MP", LOG_INFO, "%s: " "abc", __PRETTY_FUNCTION__, 1, 2);; 

这是VS 2010的错误吗?

回答

10

是的,这是Visual C++预处理器中的一个长期存在的bug。要解决它,使用间接:

#define INDIRECT_EXPAND(m, args) m args 

#define FiltedLog(...) \ 
    if (logDetail) \ 
     INDIRECT_EXPAND(MP_LOG, (LOG_INFO, __VA_ARGS__)); 

(请注意,__PRETTY_FUNCTION__是一个非标准的扩展,不采用Visual C++的支持。)

+1

你可以给这个漏洞的更多信息?例如,这个错误会发生。以及为什么这种解决方法有效。 – ZijingWu

+3

请参阅http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement –