va_copy -- porting to visual C++?(va_copy——移植到visual C++?)
问题描述
上一个问题 展示了一种打印到字符串的好方法.答案涉及 va_copy:
A previous question showed a nice way of printing to a string. The answer involved va_copy:
std::string format (const char *fmt, ...);
{
va_list ap;
va_start (ap, fmt);
std::string buf = vformat (fmt, ap);
va_end (ap);
return buf;
}
std::string vformat (const char *fmt, va_list ap)
{
// Allocate a buffer on the stack that's big enough for us almost
// all the time.
s ize_t size = 1024;
char buf[size];
// Try to vsnprintf into our buffer.
va_list apcopy;
va_copy (apcopy, ap);
int needed = vsnprintf (&buf[0], size, fmt, ap);
if (needed <= size) {
// It fit fine the first time, we're done.
return std::string (&buf[0]);
} else {
// vsnprintf reported that it wanted to write more characters
// than we allotted. So do a malloc of the right size and try again.
// This doesn't happen very often if we chose our initial size
// well.
std::vector <char> buf;
size = needed;
buf.resize (size);
needed = vsnprintf (&buf[0], size, fmt, apcopy);
return std::string (&buf[0]);
}
}
我遇到的问题是上面的代码不能移植到 Visual C++,因为它不提供 va_copy(甚至 __va_copy).那么,有谁知道如何安全地移植上述代码?据推测,我需要做一个 va_copy 副本,因为 vsnprintf 破坏性地修改了传递的 va_list.
The problem I'm having is that the above code doesn't port to Visual C++ because it doesn't provide va_copy (or even __va_copy). So, does anyone know how to safely port the above code? Presumably, I need to do a va_copy copy because vsnprintf destructively modifies the passed va_list.
推荐答案
你应该能够摆脱只是做一个常规的任务:
You should be able to get away with just doing a regular assignment:
va_list apcopy = ap;
从技术上讲,它是不可移植和未定义的行为,但它适用于大多数编译器和体系结构.在 x86 调用约定中,va_list
只是指向堆栈的指针,可以安全复制.
It's technically non-portable and undefined behavior, but it will work with most compilers and architectures. In the x86 calling convention, va_list
s are just pointers into the stack and are safe to copy.
这篇关于va_copy——移植到visual C++?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:va_copy——移植到visual C++?
基础教程推荐
- Windows Media Foundation 录制音频 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01