hex<< setw()<< setfill()不能使用指针值输出

时间:2014-07-11 14:44:10

标签: c++ formatting

  

Win7 - 64
  cygwin的
  Netbeans 7.4
  gcc(cygwin)4.8.3

编译器调用

g++ -Wall -Wno-reorder -Wno-unused-value -c -g -MMD -MP -MF

输出和预期输出有何不同?我没想到“0x”前缀。

Output   << SlipHashEntry::create      0x22a000 list3
Expected << SlipHashEntry::create      0x000000000022a000 list3

Output   << SlipDescription::delete    0x600062d50 list5
Expected << SlipDescription::delete    0x0000000600062d50 list5

以下是相关的代码段

SlipHashEntry::SlipHashEntry
    ( const string& name, void* ptr, Type type, int debugFlag )
: completeFlag(false)
, debugFlag(debugFlag)
, hashDebugFlag((bool)(debugFlag & SlipRead::HASH))
, inputDebugFlag((bool)(debugFlag & SlipRead::INPUT))
, leakDebugFlag((bool)(debugFlag & SlipRead::LEAK))
, descriptorChain(NULL)
, link(NULL)
, name(new string(name))
, nestedPtr(NULL)
, ptr(ptr)
, type(type) { 
    DEBUG(leakDebugFlag,
    cout << left << setw(27) << setfill(' ') << "SlipHashEntry::create " 
         << hex << setw(sizeof(void*)) 
         << setfill('0') << (void*)this << ' ' << name <<endl;)
}; 

1 个答案:

答案 0 :(得分:1)

  

&#34;输出和预期输出有何不同?我没想到&#34; 0x&#34; 。前缀&#34;

关于输出中的0x前缀,这是由std::ostream& operator<<(std::ostream&, const void*) see (7)

的内在运算符重载完成的。

你对setw()有一点误解:你应该记住,setw()用字符(即数字)设置字段大小。您希望显示一个64位指针,该指针相当于8个字节,每个字节的表示形式为2位数

      cout << left << setw(27) << setfill(' ') << "SlipHashEntry::create " 
           << hex << setw(2 * sizeof(void*)) 
                       // ^^^
           << setfill('0') << (void*)this << ' ' << name <<endl;)

将指针大小(以字节为单位)乘以2,得到正确的字段宽度,以获得完整的位数。

虽然void*的内在输出操作符定义并不完全符合您的要求 当我试图为我上面提到的内容编写在线可编辑样本时,我注意到你无法实际操作内在指针输出格式。我编写了一个简单的示例,如何实现您想要的固定8字节格式:

#include <iostream>
#include <iomanip>

// A simple manipulator to format pointers in a fixed length format (according 
// 64 bit) with leading zeroes and a "0x" prefix
class fmt_longptr {
public:
    fmt_longptr(void* ptr) : ptr_(ptr) {}
    void put(std::ostream& os) const {
        os << "0x" << std::hex << std::setw(2 * sizeof(void*)) 
           << std::setfill('0') << (unsigned long)ptr_;
    }
private:
    friend std::ostream& operator<<(std::ostream& os, const fmt_longptr& fmt);
    void* ptr_;
};

std::ostream& operator<<(std::ostream& os, const fmt_longptr& fmt) {
    fmt.put(os);
    return os;
}

以下是如何使用它,并显示与内在指针格式的区别

int main() {
    int a;

    std::cout << std::setfill('0') << std::setw(2 * sizeof(void*)) << &a 
              << std::endl;
    std::cout << fmt_longptr(&a) << std::endl;
    return 0;
}

输出

000x7fff270d987c
0x00007fff270d987c

这里是working online sample