- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 ...The parameter parmN is the identifier of the rightmost parameter in the variable parameter list of the function definition (the one just before the ...). If the parameter parmN is declared with a function, array, or reference type, or with a type that is not compatible with the type that results when passing an argument for which there is no parameter, the behavior is undefined.
我试图找到其他人如何处理类似功能的例子。我找到了几个博客和几个代码示例来重新创建 printf
,使用与上述类似的实现。这些例子也是不正确的吗?
在不导致未定义行为的情况下,编写类 printf
函数的合适方法是什么?
最佳答案
所以我也遇到了这个问题,这让我在处理构建输出时感到困惑。我相信这是一个错误(我在这里注册了一个: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__
的定义也有疑问。
如果您不顾一切,这将解决这些错误。
希望有人能找到一个实际的解决方案,或者至少是一个不需要自定义代码的解决方案。
谢谢,阿德里安
关于c++ - VSCode 错误 : "incorrect use of va_start",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288611/
代码工作完美,但 gcc 和 clang 报告 va_start 上存在问题 stackoverflow 要求我再写一些东西,但我真的不知道是什么 =) int Matrix_cool_input (
在带有可变参数的函数中,我们使用函数 va_start() 初始化一个 va_list 类型的对象,'ap' 为: void va_start(va_list ap, parmN); 我不明白 1.什
根据我对 va_arg 宏的了解,它检索参数列表指向的下一个参数。有什么方法可以选择我想要获取的参数的索引,比如数组索引? 例如,我需要执行一个操作,我需要至少调用 3 次 va_arg 宏,但我希望
我正在阅读 The Linux Programming Interface 一文,他们展示了这个函数来处理错误。在手册页( man stdarg )中它说 va_start必须首先调用以初始化 ap供
据说调用 va_start() 之后必须调用 va_end() 因为 va_start()(总是?)扰乱堆栈。 任何人都可以解释一下调用 va_start() 是如何修改堆栈的,以及这种修改如何帮助获
对于下面的代码: void fun(char *msg, int n, int m, ...) { va_list ptr; va_start(ptr, m); // Questio
在开始使用 va_list 之前提前退出带有可变参数的函数是否安全? ? #include int func(const char * format, ...){ if(format ==
我要制作varargs一次释放多个指针的函数,主要是为了清理代码。所以我有: void free_all( ... ) { va_list arguments; /* Initiali
为什么下面的代码不起作用? #include #include // People are missing this in their reponses.... 'fmt' here is pas
我正在使用 Visual Studio 2012 编译此示例代码: #include #include const char * __cdecl foo(const char * format,
在对历史悠久的类进行编辑时,我被架构师的一个特殊习惯所困扰,他将 va_start -> va_end 序列包装在互斥锁中。该添加的更改日志(大约 15 年前制作,此后没有修改)指出这是因为 va_s
出于某种原因,我无法正常工作: void examplefunctionname(string str, ...){ ... va_start(ap, str.c_str()); 我也
编辑:我现在有 #include 它编译 - 但可变参数没有通过。有什么想法吗? 我有这段代码(摘录): void msg(char* message, ...) { va_list args
我想创建一些日志记录,我创建了一个类。但是我在将参数传递给它时遇到了一些问题。 类: namespace debug { class log { private:
我必须在嵌入式应用程序中使用 IAR 编译器(它没有命名空间、异常、多重/虚拟继承、模板有点限制并且仅支持 C++03)。我不能使用参数包,所以我尝试使用可变参数创建成员函数。我知道可变参数通常是不安
这是我的最小示例: #include #include #include void print_strings_and_lengths(int count, ...) { va_list
具有以下 header 的函数: int max(int n, va_list vals) 在函数内部调用: int max_first(int n, ...) 需要一个 va_start(vals,
我想使用 va_start 从省略号中检索我的参数。 这是我的代码: char str[256]; void nrf_log_flash(bool is_to_save, char * log, ..
我很难在 x64 中编译我的程序。虽然我能够修复所有问题并进行编译,但我的程序在日志记录时崩溃了: void TLog::VLogAddFormat(COLORREF colorText, const
我试图在我的项目中使用 va_start 和 va_end 函数,但 eclipse 不想将其解析为函数。 gcc 编译整个项目没有错误... [我的文件.cpp] #include #includ
我是一名优秀的程序员,十分优秀!