我有一个 C++ 代码,应该可以在 Linux 和 Windows 上运行。
部分代码包括使用 vsnprintf
以使用格式字符串和参数获取字符串。
我注意到,每当格式字符串包含 %p 时,Linux 和 Windows 上的结果就会不同 - Windows 不会在结果前加上 0x 而 linux 会,而且 windows 使用大写字母作为地址字母,而 Linux 使用小写字母.
我找不到使两个版本相同的标志。
我的偏好是让 Linux 版本的行为像 Windows 版本一样(因为 Windows 代码是原始代码,所以这就是程序预期的行为方式)。
如果无法在 Linux 中更改 vsnprintf
的行为,我想要一种方法来“修复”在 vsnprintf
输出后包含 %p 的字符串(以一种有效的方式)。
最佳答案
%p
打印的字符串是 implementation defined .这就是 Linux 和 Windows 上行为不同的原因。如果您想要一致的行为,则必须实现您自己的版本。
使用 uintptr_t
,我们可以有一个可以容纳指针的整数。所以我们可以reinterpret_cast
指向它的指针。请注意,虽然转换会成功,但未指定值将包含什么。
然后,我们可以使用 std::hex
将整数打印为十六进制或适当的 format macro constant :
auto* myPointer = ...;
std::cout << std::hex << reinterpret_cast<std::uintptr_t>(myPointer) << '\n';
std::printf("%" PRIxPTR "\n", reinterpret_cast<std::uintptr_t>(myPointer));
具体格式由您决定。
关于C++ printf %p 说明符在 Linux 和 Windows 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199037/