在C++中将指针表示为字符串的最佳可移植方式是什么?

Mil*_*kov 5 c++ pointers

我需要将指针表示为用户的字符串.有时可能会将值保存到文件并传输到具有不同体系结构的计算机(当前主要问题是32对64位)并从文本文件加载以进行比较 - 我只是将加载的值相互比较,但我仍然喜欢比较数字而不是字符串.

我目前正在使用:

SomeClass* p;
...
printf("%ld", (uintptr_t)p);
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ung 20

对于指针,总是使用%p---它是一个格式说明符,专门用于以正确的格式打印指针.:-)

  • *摇头*这个差异甚至值得打扰吗?您可以_never_在所有平台上以相同的方式显示地址 - 例如,在16位实模式DOS程序中,地址通常以xxxx:yyyy格式打印.(你不能删除冒号"只是为了在平台之间保持一致" - 这会非常误导,因为实模式DOS程序中的地址空间并不平坦.) (2认同)

Fre*_*son 9

我这样做:

std::cout << p;
Run Code Online (Sandbox Code Playgroud)

如果您的心脏设置在cstdio上:

printf("%p", p);
Run Code Online (Sandbox Code Playgroud)


小智 7

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

printf( "%p", p );
Run Code Online (Sandbox Code Playgroud)

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

#include <iostream>
using namespace std;;

class A {};

int main() {
    A a;
    cout << &a << endl;
}
Run Code Online (Sandbox Code Playgroud)

生产:

0x22ff6f
Run Code Online (Sandbox Code Playgroud)