デバッグの目的で、私はしばしばポインタ値(主にthis
)をqDebugに出力します。
qDebug("pointer of current object = 0x%08x",this);
、フォーマット文字列として「%08x」を使用し、パラメータとしてthis
を渡すだけです。
ポインタ値をQStringに変換するにはどうすればよいですか?
これは私がこれまでに得たものです:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
しかし、コンパイラはその値をどうするかを理解していないようです。この場合、char
へのキャストは正しいですか?または、これを行うためのより安全な方法は何でしょうか?
Qt4.7.4でのVisualC++の使用。
[〜#〜]編集[〜#〜]
提案どおりにqulonglong
を使用する
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
コンパイラエラーメッセージ (error C2666) を生成します。
QString :: arg() の使用:
_MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
_
ポインタ(quintptr
および_QT_POINTER_SIZE
_)に正しいタイプとサイズを使用し、常に_"0x"
_のプレフィックスを付けます。
注:
値の前にゼロを付けるには、4番目のパラメーターをQChar('0')
にする必要があります。
正しい桁数を出力するには、_QT_POINTER_SIZE
_を2倍にする必要があります(各バイトには2桁の16進数が必要なため)。
単にQString & QString::sprintf ( const char * cformat, ... )
を使用してみませんか
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream は、求めている機能を提供しているように見え、void*
で動作します。
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
他のアプローチとは異なり、特定の番号「8」や「qlonglong」へのキャストなどの概念は参照されません。それほど気にならないと思われ、 std :: stringの規定のメソッド(ただし、std::string
変換を含まない)
sprintf
を使用して中間ステップを実行できます。
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
またはostringstream
を介して:
QString pointer_to_qstring(void *ptr)
{
std::ostringstream oss;
oss << std::setw(8) << std::setfill('0') << std::hex << ptr:
return QString(oss.str().c_str());
}
私にとっては、ほとんどの場合、ポインターがnullptr
であるかどうか、または他のポインターと同じ値であるかどうかを確認するだけで十分です。そのような場合は、ポインタを数値に変換してからQString::number()
を使用するだけで十分です。
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;