Qt Creator调试器逐步进入QString代码。

4

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

我的pro文件:

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.1Qt 3.0.1


请问您能否添加在您的.pro文件/代码中定义的标志吗?您可能有一个已经过时的 #define QT_ASCII_CAST_WARNINGS,从而触发了警告。 - Armaghast
正如您所见,我的代码非常简单。 - Martin Delille
我不能给你最终答案,但我可以帮一点忙:你收到一个警告,因为QT_ASCII_CAST_WARN可能扩展为空(这将不会引起任何问题)或Q_DECL_DEPRECATED(这是一个特定于编译器的宏,用于触发警告)。请参见https://qt.gitorious.org/qt/qt/source/7982a378c7058ca6b1ee29f5f5039cb62d2dcfd5:src/corelib/global/qglobal.h的第1135行。 解决方法A:在包含QString之前未定义QT_ASCII_CAST_WARNINGS(但我看不出它首先被定义的原因)B:使用像QString :: fromUtf8(“coucou”)或 QStringLiteral(“coucou”)之类的char *-> QString方法。 - Armaghast
你可以添加你的qt版本和编译器版本;我建议你检查预处理器输出(参见https://dev59.com/SG855IYBdhLWcg3wKxHc以获取相关内容)。 - Armaghast
1个回答

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

我希望现在非常清楚。


1
我理解你的观点,但是使用你的解决方案会让我进入比之前更加无聊的代码中:qstring.hqglobal.hqrefcount.hqbasicatomic.h等。 - Martin Delille
那就不要进去??如果你告诉调试器要进入某个东西,它就会进入。这就是为什么有“跳过步骤”的选项。 - user3427419
1
我想直接进入显示函数,而不是进入qstring的详细信息,但这似乎是不可能的。 - Martin Delille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接