VSCode 错误: "incorrect use of va_start"

VSCode Error: "incorrect use of va_start"

本文关键字:va start of incorrect 错误 VSCode use      更新时间:2023-10-16

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的函数的合适方法是什么

所以我也遇到了这个问题,它在处理构建输出时让我感到困惑。我相信这是一个bug(我在这里注册了一个: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__的定义也有意见。

如果你绝望了,这将消除这些错误。

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

谢谢,Adrian

我知道这是一个5年前的问题,这个回答只针对将来遇到这个问题的人。我在发布btw.时使用的是最新版本的VS代码

该问题可能是由c_cpp_properties中的错误设置引起的,如果您的项目中没有设置,那么它将使用默认设置。您需要将compilerPath和intelliSenseMode设置为gcc,而不是clang。

{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "c++14",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
相关文章: