C ++打印指针不承认showbase

时间:2017-05-22 22:19:00

标签: c++ visual-c++ g++

我注意到我们打印指针的方式存在差异。默认情况下,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___ ....之类的事情,但我想知道我是否遗漏了一些更明显的事情。感谢

1 个答案:

答案 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

live demo

起初我对你的问题(更具体地说,通过这些实现&#39;行为)感到有些惊讶,但我越是想到它就越有意义。指针不是数字*,并且实际上没有更好的权限来呈现它们。

*我很认真!虽然有趣的是,出于实施/历史原因,该标准会调用const void*&#34;数字&#34;在此上下文中,使用num_put区域设置内容来格式化输出,最终推迟到printf中的[facet.num.put.virtuals]。标准规定应该使用格式化说明符%p,但由于%p的结果是实现定义的,因此您可以使用当前代码获得任何内容。