使用 Qt Creator 进行调试时,每次我使用 QString 作为参数进入某个方法时,我会触及一些恼人的 qstring.h 代码:
// ASCII compatibility
#ifndef QT_NO_CAST_FROM_ASCII
inline QT_ASCII_CAST_WARN QString(const char *ch)
: d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1))
{}
有没有办法避免调试器进入 qstring.h ?
我的专业档案:
QT += core
QT -= gui
TARGET = ConsoleTest03
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
我的代码:
#include <QDebug>
#include <QString>
void display(QString s)
{
qDebug() << s;
}
int main(int argc, char *argv[])
{
display("coucou");
return 0;
}
我使用 Qt 5.1.1 和 Qt 3.0.1 。
答案 0 :(得分:1)
你到达那里是因为你在代码中调用了那个构造函数。
display("coucou");
实际上是的
display(QString("coucou"));
和QString(const char *)不是你真正要做的事情。 http://qt-project.org/doc/qt-5/qstring.html#QString-8
您可以通过不在该行上调用
来禁用步进构造函数QString str(QLatin1String("coucou")); // you don't really need QLatin1String
// if you are happy with 'const char*' constructor
display(str);
现在,您不再在display()行上获得QString构造函数。或者,在display()函数上创建一个断点,而不是Step In,继续执行。
您还调用QString复制构造函数,因为您的函数采用QString,而不是实际对象的引用或指针。这应该很容易在调试器中发现,而不是称之为“烦人”。所以,这里有一些代码可以让你在没有任何其他东西的情况下进入display(),
#include <QDebug>
#include <QString>
void display(const QString &s)
{
qDebug() << s;
}
int main(int argc, char *argv[])
{
QString str(QLatin1String("foo"));
display(str);
return 0;
}
我希望现在非常非常清楚。