c - 宏中的可变参数

标签 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

基本上,想法是打开和关闭调试开关~~~

  • 问题: 上述逻辑在 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/

相关文章:

C malloc - 初始化元素不是编译时常量

c - 尝试使用 const 初始化变量时出现错误 "initializer element is not constant"

macros - Clojure 源代码库

c++ - 如何在 C++ 中定义宏函数返回 void 或 else

java - 从 Java 代码运行 MSVC 编译器会出现错误

c - 使用数组时出现段错误

对 const 语法的困惑

从不同文件调用时,C++ __TIME__ 是不同的

c++ - 正在运行的线程中的 cstatic 控件的 Redrawwindow

c++ - libpng 在 png_write_into 上崩溃(Windows 10,VS2013,自建,所有测试通过 ok)