QString格式将无法使用QDebug
QString formatting will not work qDebug
我尝试避免使用QT程序中的QString
和char*
类型。我有一个会话功能,该功能返回QString
内的数据指针,但是结果我会得到非常奇怪的结果。此代码怎么了?
编译器和环境GCC(Debian 4.9.2-10)4.9.2通过QMAKE的标志:QMAKE_CXXFLAGS += -std=c++11
代码段:
#include <QCoreApplication>
#include <iostream>
#define PCH(m) ( m.toAscii().data() )
// get the pointer short scripted
const char* CH(QString msg) {
const char* res = msg.toAscii().data();
return res;
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
const QString qformat = "%s does not work!";
const QString qvalue = "embedding";
// Works not
qDebug(CH(qformat), CH(qvalue));
// Works
qDebug(qformat.toAscii().data(), qvalue.toAscii().data());
// Works too but macro
qDebug(PCH(qformat), PCH(qvalue));
return app.exec();
}
结果
%s does not work! does not work!
embedding does not work!
embedding does not work!
在这里,您将QString
复制到功能,然后将指针返回到函数内已经破坏的数据。这是已知的未定义行为,因为您将指针返回垃圾。返回QString。
const char* CH(QString msg) {
const char* res = msg.toAscii().data();
return res;
}
您应该使用qDebug()
和QString
本身内置的格式机制。您还应该使用QStringLiteral
而不是依赖默认字符串转换 - 毕竟您说明您关心这样的事情:
#include <QtCore>
int main()
{
const auto qformat = QStringLiteral("%1 does work!");
const auto qvalue = QStringLiteral("embedding");
qDebug() << qformat.arg(qvalue);
qDebug() << qformat.arg(0x7A01173C2, 0, 16);
}
在现代编译器上使用的QStringLiteral
not 创建一个8位C弦。它在编译时组装了QString
的二进制内部表示形式,并将其存储在可执行文件的只读内存部分中。这是避免字符串编码的运行时成本的唯一方法。
如果您已经拥有编码UTF8编码的UTF8编码字符串文字或C风格字符串,则通过QString
进行往返都没有任何好处。如果您需要使用C风格的字符串/字符串文字,请与qDebug
直接使用它们:
#include <QtCore>
int main() {
const char format[] = "%s does not work!";
const char value[] = "embedding";
qDebug(format, value);
}
如果您需要通过临时的C风格字符串,请使用QByteArray
,但这确实是很多代码,几乎没有什么可显示的 - 详细说明很详细,以至于具有非常糟糕的代码气味。所以不要这样这样做:
#include <QtCore>
QByteArray CH(const QString &msg) {
return msg.toLocal8Bit();
}
int main()
{
auto qformat = QStringLiteral("%s does work!");
auto qvalue = QStringLiteral("embedding");
qDebug(CH(qformat).constData(), CH(qvalue).constData());
}
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- qDebug - 如何以位(二进制格式)输出数据
- QString格式将无法使用QDebug
- 可以全局设置qDebug()浮点精度和数字格式吗?