【问题标题】:What's the best portable way to represent pointer as string in C++?在 C++ 中将指针表示为字符串的最佳可移植方式是什么?
【发布时间】:2009-06-03 20:35:41
【问题描述】:

我需要将指针表示为用户的字符串。有时这些值可能会保存到一个文件中并传输到具有不同架构的计算机(32 位与 64 位是当前的主要问题)并从文本文件加载进行比较 - 我只会比较加载的值 彼此,但我仍然更喜欢比较数字而不是字符串。

我目前正在使用:

SomeClass* p;
...
printf("%ld", (uintptr_t)p);

但我想知道这是否是可移植的(不过,Windows 和 Linux 仅在这个阶段很重要),一旦 128 位系统出现,这是否会破坏?

编辑:除非我决定使用 uint64_t,并确定 64 位是屋顶,否则这是无法完成的,因为某些 64 位指针可能超出 32 位整数范围。所以,我决定比较字符串会更安全,即使它比较慢。

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    对于指针,请始终使用%p---它是专门为以正确格式打印指针而设计的格式说明符。 :-)

    【讨论】:

    • 但它不是便携的。至少,它没有在平台之间提供一致的输出。在 Visual Studio 中,十六进制值以大写形式出现。在 gcc 中,小写。
    • 摇头 这种差异还值得烦恼吗?您可以永远让地址在所有平台上都以相同的方式出现——例如,在 16 位实模式 DOS 程序中,地址通常以 xxxx:yyyy 格式打印。 (你不能删除冒号“只是为了在平台之间保持一致”——这会非常误导,因为实模式 DOS 程序中的地址空间不是平坦的。)
    • 例如,0x11110000 和 0x11120000,在平面寻址模型中,相隔 0x10000 字节。但是,在 16 位实模式 DOS 程序中,1111:0000 和 1112:0000 相隔 16 个字节。
    • @Chris:这是我写这个问题的主要原因。使用 uintptr_t 似乎可以确保指针字符串的格式跨平台是相同的,因为它是纯数字。
    • 正如您所说,您希望将其呈现给用户。我想知道代表他们无意义的数字有什么好处。为什么不以他们理解的格式保存它
    【解决方案2】:

    我会这样做:

    std::cout << p;
    

    如果您对 cstdio 有信心:

    printf("%p", p);
    

    【讨论】:

    • 谢谢弗雷德。实际上,我使用的是 wxWidgets,它具有 wxString::Format 函数,该函数在内部使用 snprintf,这就是我需要 printf 示例的原因。
    【解决方案3】:

    printf 有一个我认为是标准化的 %p 格式化程序:

    printf( "%p", p );
    

    但是当你使用 C++ 时,ostreams 已经重载了指针输出:

    #include <iostream>
    using namespace std;;
    
    class A {};
    
    int main() {
        A a;
        cout << &a << endl;
    }
    

    产生:

    0x22ff6f
    

    【讨论】:

    • 不过要小心。因为他们还专门针对 char* 输出运算符并打印 C-String。
    【解决方案4】:

    您在寻找%p 格式化字符串吗?

    printf("%p", p);
    

    这将给出指针指向的十六进制编码地址(我认为,NULLs 的格式也适合你)。

    【讨论】:

      【解决方案5】:

      我会做的:

      cout << p << endl;
      

      字符串(相同编码)是可移植的。如果要将它们作为指针进行比较,则必须先将字符串解析回unsigned long

      对于 128 位系统,它们还有很长的路要走。使用 64 位,您可以直接寻址 1680 万 TB 的 RAM。

      【讨论】:

        【解决方案6】:

        也可以这样

        printf("%#x", p);

        这将确保跨平台的格式相似 (0x...)。

        【讨论】:

          猜你喜欢
          • 2011-11-06
          • 1970-01-01
          • 2011-10-12
          • 2015-11-07
          • 2019-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多