我有一个带变量参数的函数,类似于下面的
int log_data (LOG_TYPE eType, ...)
{
/** some logging related stuff here **/
}
在头文件中,我使用类似
的内容#ifdef LOGGING_ENABLED
int log_data (int nType, ...);
#else
#define log_data(_x_, ...)
#endif
基本上,我们的想法是SWITCH调试ON&关~~~
答案 0 :(得分:4)
Variadic宏相对较新,例如:this reference表示“在Visual C ++ 2005中引入了对可变参数宏的支持。”您可能有旧版本。
编辑:如果要进行调试,则声明log_data
,如果不需要,则声明为#ifdef
。这意味着您在int log_data (int nType, ...)
{
#ifdef LOGGING_ENABLED
/* the code to do logging */
#else
return 0; /* or whatever */
#endif
}
中也拥有该函数的定义。只要您这样做,解决方案就是:
int log_data (int nType, ...);
并在头文件中,像往常一样声明函数:
{{1}}
这样做的缺点是,即使您没有记录,函数调用也存在,但优点是它可以在没有预处理器支持的情况下工作。
答案 1 :(得分:3)
较早版本的VC ++不支持宏中的变量参数。
你可以用这个技巧解决它:
#ifdef LOGGING_ENABLED
#define log_data log_data_impl
#else
#define log_data
#endif
// usage:
log_data(level, ...)
更新 - 另一种可行的解决方法:
#ifdef LOGGING_ENABLED
#define log_data(P) log_data_impl P // no braces around P!
#else
#define log_data(P)
#endif
// usage: we have to use two braces
log_data((level, ...));