我注意到我们打印指针的方式存在差异。默认情况下,gcc是将0x前缀添加到指针的十六进制输出,而Microsoft的编译器不会这样做。 showbase / noshowbase不会影响其中任何一个。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
void * n = (void *)1;
cout << noshowbase << hex << n << dec << endl;
// output (g++ (GCC) 4.7.2, 5.4.0): 0x1
// output (VS 2010, 2013): 00000001
n = (void *)10;
cout << noshowbase << hex << n << dec << endl;
// output (g++ (GCC) 4.7.2, 5.4.0): 0xa
// output (VS 2010, 2013): 0000000A
n = (void *)0;
cout << noshowbase << hex << n << dec << endl;
// output (g++ (GCC) 4.7.2, 5.4.0): 0
// output (VS 2010, 2013): 00000000
return 0;
}
我认为这是实现定义的行为而不是错误,但有没有办法阻止任何编译器在0x之前添加?我们已经在我们自己的前面加上了0x但是在gcc中它出现了像0x0xABCD。
我确定我可以做ifdef __GNUC___ ....
之类的事情,但我想知道我是否遗漏了一些更明显的事情。感谢
答案 0 :(得分:3)
我建议您转换为intptr
并将输入视为普通整数
然后你的I / O操纵器应该工作。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
void * n = (void *)1;
cout << noshowbase << hex << reinterpret_cast<intptr_t>(n) << dec << endl;
n = (void *)10;
cout << noshowbase << hex << reinterpret_cast<intptr_t>(n) << dec << endl;
n = (void *)0;
cout << noshowbase << hex << reinterpret_cast<intptr_t>(n) << dec << endl;
}
// 1
// a
// 0
起初我对你的问题(更具体地说,通过这些实现&#39;行为)感到有些惊讶,但我越是想到它就越有意义。指针不是数字*,并且实际上没有更好的权限来呈现它们。
*我很认真!虽然有趣的是,出于实施/历史原因,该标准会调用const void*
&#34;数字&#34;在此上下文中,使用num_put
区域设置内容来格式化输出,最终推迟到printf
中的[facet.num.put.virtuals]
。标准规定应该使用格式化说明符%p
,但由于%p
的结果是实现定义的,因此您可以使用当前代码获得任何内容。