0

我有一个接受可变参数的函数,如下所示

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&OFF~~~

  • 问题:上述逻辑在 Linux 和 gcc 中运行良好,但在 Windows VC++ 中编译时出错。
4

2 回答 2

4

可变参数宏相对较新,例如:此参考资料说“对可变参数宏的支持是在 Visual C++ 2005 中引入的”。你可能有一个旧版本。

编辑:您是在声明log_data是否要调试,而不是如果您不想。这意味着您在 an 中也有函数的定义#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, ...);

这有一个缺点,即即使您没有记录,函数调用也存在,但优点是它可以在没有预处理器支持可变参数的情况下工作。

于 2009-12-14T06:38:16.077 回答
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, ...));
于 2009-12-14T06:37:18.493 回答