宏中的变量参数

时间:2009-12-14 06:33:47

标签: c macros visual-c++ variadic-functions

我有一个带变量参数的函数,类似于下面的

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

  • 问题: 上述逻辑在Linux& gcc,但在Windows VC ++中编译时出错。

2 个答案:

答案 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, ...));