C++ VSCode错误:";va“U start”的使用不正确;

C++ VSCode错误:";va“U start”的使用不正确;,c++,visual-studio-code,printf,variadic-functions,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是函数定义的变量参

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,或者使用与传递没有参数的参数时产生的类型不兼容的类型声明参数parmN,则行为未定义

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


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

因此我也遇到了这个问题,在处理生成输出时,它让我感到困惑。我相信这是一个bug(我在这里注册了一个:)

我发现在
\uuuu INTELLISENSE\uuuuu
构建中使用特殊的预处理器逻辑可能是一个非常糟糕的工作(如果平台无法在本地支持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
我对
的定义也有疑问

如果你很绝望,这会让这些错误消失

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

谢谢,
阿德里安

@chrisg Cat收到你的评论了吗;PWhy you believe that quote said the code have undefined behavior?char指针可以作为
va_start()
的参数(它不是函数、数组或引用类型)。vscode是否提供了关于它认为问题所在的更多细节?也许vscode不喜欢这样没有
va_end()
?从技术上讲,应该有一个,尽管我认为它在Visual C/C中实际上没有任何作用。您有关于您的环境的更多信息吗?您在哪个平台上,使用哪个编译器/版本?在编译代码时,这是一个实际的错误或警告,还是只是一个提示,表明VSCode向您显示的可能并非真正源自编译器?我在macOS 10.13.3 w/llvm上使用VSCode。这很可能是VSCode的一个错误,但我认为他们知道的比我多,所以我进行了研究并最终联系到这里,以便更好地理解。