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
的函数的适当方法是什么?
答案 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__
的定义有疑问。
如果你感到绝望,这将会导致这些错误。
希望有人会找出一个实际的解决方案,或者至少一个不需要自定义代码的解决方案。
谢谢, 阿德里安