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;)
};
答案 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