我有一个接受可变参数的函数,如下所示
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
基本上,想法是打开和关闭调试开关~~~
- 问题: 上述逻辑在 Linux 和 gcc 中运行良好,但在 Windows VC++ 中编译时出错。
最佳答案
可变参数宏相对较新,例如: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, ...);
这有一个缺点,即即使您没有记录,函数调用也存在,但优点是它可以在没有预处理器支持可变参数的情况下工作。
关于c - 宏中的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899266/