Qt Creator调试器步入QString代码

时间:2014-03-18 15:45:16

标签: qt debugging qt-creator qstring

使用 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

编辑1

我的专业档案:

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

编辑2

我使用 Qt 5.1.1 Qt 3.0.1

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

我希望现在非常非常清楚。