簡體   English   中英

十六進制<< setw()<< setfill()不適用於指針值輸出

[英]hex << setw() << setfill() doesn't work with pointer value output

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

“輸出與預期輸出不同的任何原因?我沒想到前綴“ 0x”。”

關於輸出中的0x前綴,這是由std::ostream& operator<<(std::ostream&, const void*)的內部運算符重載完成的, std::ostream& operator<<(std::ostream&, const void*) 參見(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

這是在線工作示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM