Varargs 无法在 64 位中与托管对象一起工作?
我正在尝试将一些托管 C++ 代码迁移到 64 位。 我有一个获取可变参数的函数,当我将 System::String 变量传递给它时,它似乎没有正确传递。 以下是显示问题的代码的简化版:
#include <stdio.h>
#include <stdarg.h>
void test(char* formatPtr, ...)
{
va_list args;
int bufSize;
char buffer[2600];
/////////////////////////////////////
//parse arguments from function stack
/////////////////////////////////////
va_start(args, formatPtr);
bufSize = vsprintf(buffer, (const char*) formatPtr, args);
printf(buffer);
va_end(args);
}
void main() {
System::String^ s;
s = "Shahar";
test("Hello %s", s);
getchar();
}
当此代码以 32 位运行时,它会显示 Hello Shahar。
当它以 64 位运行时,它会显示 Hello Çz∟⌠■。
假设我想对代码进行最少的更改,我应该如何解决这个问题?
I'm trying to migrate some managed c++ code to 64bits.
I have a function that gets varargs, and when I pass a System::String variable to it, it appears not to pass correctly.
Here is a simplification of the code that shows the problem:
#include <stdio.h>
#include <stdarg.h>
void test(char* formatPtr, ...)
{
va_list args;
int bufSize;
char buffer[2600];
/////////////////////////////////////
//parse arguments from function stack
/////////////////////////////////////
va_start(args, formatPtr);
bufSize = vsprintf(buffer, (const char*) formatPtr, args);
printf(buffer);
va_end(args);
}
void main() {
System::String^ s;
s = "Shahar";
test("Hello %s", s);
getchar();
}
When this code runs in 32 bits, it displays Hello Shahar.
When it runs in 64 bits, it displays Hello Çz∟⌠■.
Assuming I want to make the least amount of changes to the code, how should I fix this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看起来问题似乎出在托管代码和可变参数之间的混合中。它们似乎彼此不兼容。
我不知道为什么这在 32 位下有效,但看起来这是错误的做法。
我更改了代码,以便仅成为托管代码,没有可变参数。
It looks as though the problem is in the mix between managed code and varargs. It appears that they are not compatible with each other.
I don't know why this works in 32-bits, but it looks like the wrong thing to do.
I changed the code, so as to be only managed code, with no varargs.
%s 说明符需要 C 风格的以 null 结尾的字符串,而不是 System::String^。 C++/CLI 标头提供了一些可以将 System::String^ 转换为 std::string 的方法,std::string 可以转换为 C 字符串,并且可能可以直接转换为 C 字符串。
你还有其他问题。无效主()?将文字分配给 char*?固定大小的缓冲区?
The %s specifier expects a C-style null-terminated string, not a System::String^. C++/CLI headers provide some methods that can convert System::String^ to std::string, which can be converted to a C-string, and can probably just convert straight to a C-string.
You have other problems too. void main()? Assigning a literal to a char*? Fixed-size buffer?