VSCode错误:“错误使用va_start”

时间:2018-03-14 22:26:57

标签: c++ visual-studio-code printf variadic-functions

VSCode抱怨在以下当前正在运行的功能中使用va_start

void _log(int level, const char *format, ...)
{
    va_list arglist;
    va_start(arglist, format);
    writelog(level, format, arglist);
}

在搜索之后,我发现了对标准的引用,表明VSCode是正确的,代码将导致未定义的行为。

  

18.10 / 3 ...参数parmN是函数定义的变量参数列表中最右边的参数的标识符(恰好在......之前)。如果使用函数,数组或引用类型声明参数parmN,或者使用与传递没有参数的参数时产生的类型不兼容的类型,则行为未定义。

我试图找到其他人如何处理类似功能的示例。我找到了几个博客和几个代码示例,使用类似于上面的实现重新创建printf。这些例子也不正确吗?

在不导致未定义行为的情况下编写类似printf的函数的适当方法是什么?

1 个答案:

答案 0 :(得分:1)

所以我也遇到了这个问题,在使用构建输出时我很困惑。我相信它是一个错误(我在这里注册了一个:https://github.com/Microsoft/vscode-cpptools/issues/1720)。

我发现了为__INTELLISENSE__构建使用特殊预处理器逻辑可能很糟糕的工作(如果平台本身不能支持Intellisense,那么这是必要的,但vscode是跨平台的......)。

这是解决方法:

#if __INTELLISENSE__
#undef va_start(arg, va)
#define va_start(arg, va)
#undef va_end(va)
#define va_end(va)
#undef va_copy(va0, va1)
#define va_copy(arg0, va1)
#define __INT_MAX__ 0x7fffffff
#endif

我也对__INT_MAX__的定义有疑问。

如果你感到绝望,这将会导致这些错误。

希望有人会找出一个实际的解决方案,或者至少一个不需要自定义代码的解决方案。

谢谢, 阿德里安