Varargs 无法在 64 位中与托管对象一起工作?

发布于 2024-10-07 16:38:19 字数 831 浏览 2 评论 0原文

我正在尝试将一些托管 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风铃鹿 2024-10-14 16:38:19

看起来问题似乎出在托管代码和可变参数之间的混合中。它们似乎彼此不兼容

我不知道为什么这在 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.

零崎曲识 2024-10-14 16:38:19

%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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文