c++ VSCode错误:“错误使用va_start”

fjaof16o  于 2023-04-13  发布在  Vscode
关注(0)|答案(2)|浏览(366)

VSCode抱怨在下面的 currently working 函数中使用了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的函数,而不会导致未定义的行为?

xqkwcwgp

xqkwcwgp1#

所以我也遇到了这个问题,当我处理构建输出时,它让我感到困惑。我相信这是一个bug(我在这里注册了一个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__的定义也有问题。
如果你很绝望,这将得到这些错误的方式。
希望有人能找出一个实际的解决方案,或者至少是一个不需要定制代码的解决方案。
谢谢,艾利安

eufgjt7s

eufgjt7s2#

我知道这是一个5年前的问题,这个回复只针对将来遇到这个问题的人。顺便说一句,我在发帖时使用的是最新版本的VS代码。
该问题可能是由c_cpp_properties中的错误设置引起的,如果您的项目中没有c_cpp_properties,则它将使用默认值。您需要将compilerPath和intelliseMode设置为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
}

相关问题