Как преобразовать значение указателя в QString?
для целей отладки Я часто выводят значения указателя (в основном 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
? Или что было бы более безопасным способом сделать это?
Использование Visual С++ с Qt 4.7.4.
ИЗМЕНИТЬ
Используя qulonglong
как предложено
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
выводится в сообщении об ошибке компилятора (ошибка C2666).
Ответы
Ответ 1
Другое решение:
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
Он будет использовать правильный размер и тип для указателей (quintptr
и QT_POINTER_SIZE
) и всегда будет префикс "0x"
Edit:
Чтобы префикс значения с нулями, четвертый параметр должен быть "QChar ('0')". Чтобы вывести правильное количество цифр, QT_POINTER_SIZE
необходимо удвоить (поскольку каждый байт нуждается в двух шестнадцатеричных цифрах).
Ответ 2
Почему бы просто не использовать QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
Ответ 3
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
)
Ответ 4
Вы можете сделать промежуточный шаг с 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());
}
Ответ 5
Для меня в основном достаточно посмотреть, является ли указатель nullptr
или имеет то же значение, что и другой указатель. Для этих случаев достаточно преобразовать указатель в число, а затем использовать QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;