C++ printf %p 说明符在 Linux 和 Windows 中的行为不同

标签 c++ linux windows portability

我有一个 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));

Demo

具体格式由您决定。

关于C++ printf %p 说明符在 Linux 和 Windows 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199037/

相关文章:

c++ - 从 node.js 中的 C++ 命名管道读取时缺少数据

c - 在 C 中解析和读取数据帧?

windows - 关闭 Visual Studio 2010 时出现问题

c++ - 函数对象的任何最佳实践

c++ - 无法在赋值中将 'list*' 转换为 'Node*'

c - 使用静态数组初始化常量结构对象

windows - 如何添加默认值包含双引号和百分号的注册表项?

c++ - 代码阻止调试器无法启动

c++ - 将字符串/ double vector 转换为数组

linux - 在 Linux 上远程执行可执行文件?