- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Visual Studio 2012 编译此示例代码:
#include <stdarg.h>
#include <stdio.h>
const char * __cdecl foo(const char * format, const char * requiredArgument, ...)
{
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
return requiredArgument;
}
int main(int, char **)
{
foo("The %s is %d pixels wide and %d pixels high.", "box", 300, 200);
return 0;
}
程序的调试构建在打印消息“盒子宽 300 像素,高 200 像素”后正常终止。
发布版本因段错误而崩溃。
我对这种行为的解释 - 但我可能错了,如果是这样请纠正我 - 我错误地指定了一个函数参数,而不是 va_start
,这里唯一可接受的形式是 va_start(args, requiredArgument)
而不是我希望的 va_start(args, format)
。换句话说,我滥用 va_start
的方式使整个程序的流程变得不可预测,因此这里的段错误不过是正常的。
如果我的假设是正确的,我现在有两个问题:
为什么还需要在 va_start
中指定最后一个正式声明的函数参数,如果选择其他任何参数显然是非法的?
为什么挑剔的 VC++ 编译器不对如此容易检测和潜在严重的陷阱发出警告?
最佳答案
Why is it even required to specify the last formally declared function parameter in va_start, if choosing anything else is apparently illegal?
因为该宏需要知道最后一个参数的地址。
Why does the picky VC++ compiler not raise a warning for such an easy to detect and potentially critical pitfall?
因为它还不够“智能”。或者它的创建者决定不包含此警告。或许它可以,但默认情况下它是关闭的,您可以使用一些编译器标志将其打开。
关于C++ 为什么 va_start 期望最后一个非可变函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674028/
代码工作完美,但 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
我是一名优秀的程序员,十分优秀!