【发布时间】:2017-06-02 05:29:03
【问题描述】:
我对我的代码进行了一些编辑,然后做了大约 15 次“撤消”操作以回到我上次成功编译的位置,只是没有编译它,而是出现了这个前所未有的错误:
expected unqualified-id before 'nullptr'
双击错误将我带到qcompilerdetection.h 的下面部分,这是一个我不知道存在的文件。我对代码的编辑是如何弄乱这个文件的?或者这是对真正问题的误导?我知道我已经出现了错误,因为在代码中完全不同的地方缺少括号......所以我检查了我在上次成功编译和这个编译之间编辑的每一行代码。不幸的是,我是个白痴,并在“重做”所有内容之前关闭了程序,看看是否修复了它。所以现在我不知道要更改什么来修复,而且我太菜鸟了,无法在不进一步破坏我的代码的情况下做任何事情。
/*
* C++11 keywords and expressions
*/
#ifdef Q_COMPILER_NULLPTR
# define Q_NULLPTR nullptr
#else
# define Q_NULLPTR NULL
#endif
#ifdef Q_COMPILER_DEFAULT_MEMBERS
# define Q_DECL_EQ_DEFAULT = default
#else
# define Q_DECL_EQ_DEFAULT
#endif
#ifdef Q_COMPILER_DELETE_MEMBERS
# define Q_DECL_EQ_DELETE = delete
#else
# define Q_DECL_EQ_DELETE
#endif
具体到这一点:
# define Q_NULLPTR nullptr
^
如果有帮助的话,我正在 Raspberry Pi 3 上的 Qt5 中设置 QThread。以前从未见过这样的问题,只有我实际编写的代码中出现错误。这是我调试器派上用场的地方吗?我不知道如何在 Qt Creator 中使用它。
如果它有助于查看...这是我正在处理的代码。
在press.cpp
#include <QDebug>
#include <wiringPi.h>
#include "functions.h"
#include "press.h"
#define PUMP 21
#define SOLENOID_DWN 24
#define SOLENOID_UP 25
#define LIGHT_LEFT 26
#define LIGHT_RIGHT 27
#define LASER 28
#define ENCODER_A 0
#define ENCODER_B 2
#define PEDAL_RIGHT 12
#define PEDAL_LEFT 13
#define HOME 14
Press::Press()
{
}
void Press::programRun() {
qDebug() << "Hunting Position...";
qDebug() << positionTarget;
digitalWrite(PUMP,HIGH);
digitalWrite(SOLENOID_DWN,HIGH);
upFlag = 0;
while (pos > positionTarget){
if (stopFlag == 1){
emit stop();
qDebug() << "emit stopped";
return;
}
if (pausedFlag == 1){
if (digitalRead(PEDAL_LEFT) == LOW){
//Functions::programUnpause();
emit resume();
qDebug() << "emit resumed";
delay(100);
while (digitalRead(PEDAL_LEFT) == LOW){}
delay(100);
}
}
if (digitalRead(PEDAL_RIGHT) == LOW){
emit stop();
//Functions::programStop();
delay(100);
while (digitalRead(PEDAL_RIGHT) == LOW){}
delay(100);
}
if (digitalRead(PEDAL_LEFT) == LOW){
//Functions::programPause();
emit pause();
delay(100);
while (digitalRead(PEDAL_LEFT) == LOW){}
delay(100);
}
delayMicroseconds(30);
}
//Functions::solenoidOff();
//Functions::solenoidUp();
upFlag = 1;
//Functions::programPause();
emit pause();
while (digitalRead(HOME) == HIGH){
if (stopFlag == 1){
emit stop();
qDebug() << "emit stopped";
return;
}
if (pausedFlag == 1){
if (digitalRead(PEDAL_LEFT) == LOW){
//Functions::programUnpause();
emit resume();
qDebug() << "emit resumed";
delay(100);
while (digitalRead(PEDAL_LEFT) == LOW){}
delay(100);
}
}
if (digitalRead(PEDAL_RIGHT) == LOW){
emit stop();
//Functions::programStop();
delay(100);
while (digitalRead(PEDAL_RIGHT) == LOW){}
delay(100);
}
if (digitalRead(PEDAL_LEFT) == LOW){
//Functions::programPause();
emit pause();
qDebug() << "emit paused";
delay(100);
while (digitalRead(PEDAL_LEFT) == LOW){}
delay(100);
}
delayMicroseconds(30);
}
qDebug() << "FINISHED";
emit stop();
Functions::solenoidOff();
}
在main.cpp
#include <QCursor>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFile>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFuture>
#include <QThread>
#include <QtConcurrent>
#include <QObject>
#include <wiringPi.h>
#include <pthread.h>
#include "datahandler.h"
#include "functions.h"
#include "press.h"
#define PUMP 21
#define SOLENOID_DWN 24
#define SOLENOID_UP 25
#define LIGHT_LEFT 26
#define LIGHT_RIGHT 27
#define LASER 28
#define ENCODER_A 0
#define ENCODER_B 2
#define PEDAL_RIGHT 12
#define PEDAL_LEFT 13
#define HOME 14
QScopedPointer<Functions> myFunctions(new Functions);
QScopedPointer<DataHandler> myData(new DataHandler);
QThread* thread = new QThread;
Press* pressProgram = new Press();
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
app.setOverrideCursor( QCursor( Qt::BlankCursor ) ); //Hide the cursor
pressProgram->moveToThread(thread);
QObject::connect(thread, SIGNAL (started()), pressProgram, SLOT (programRun()));
QObject::connect(pressProgram, SIGNAL (stop()), thread, SLOT (quit()));
QObject::connect(pressProgram, SIGNAL (stop()), thread, SLOT (deleteLater()));
QObject::connect(pressProgram, SIGNAL (stop()), pressProgram, SLOT (deleteLater()));
//thread->start();
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("pressProgram",pressProgram);
engine.rootContext()->setContextProperty("myFunctions",myFunctions.data());
engine.rootContext()->setContextProperty("myData",myData.data());
engine.rootContext()->setContextProperty("noteProfileArray",noteProfileArray);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
【问题讨论】:
-
在编译某些实现 (
.cpp) 文件时,通常会发生头文件中的错误。发生此错误时正在编译哪个实现文件? -
一旦你确定了哪个 cpp 文件报告了错误,就可以开始雕刻了。您不需要任何代码来重现错误,只需包含语句即可。注释掉最后一个 include 之后的所有内容。建造。如果错误消失,请射击。我错了。一个一个地添加每个函数,直到它不构建。现在您知道哪个函数是问题所在,开始注释掉函数的某些部分以进一步缩小问题范围。如果我是对的,请开始一一注释掉标题。缩小搜索范围。
-
当错误发生时,不确定如何检查哪个
.cpp文件正在进行中。我将开始搜索“Qt Creator 调试” -
@daGriggs 你可以先尝试制造minimal reproducible example。一种方法是:开始从你的项目中取出一些东西,直到它停止失败。
-
谢谢,我尝试了一些删除,发现它使事情变得更加复杂,因为发生了损坏的#includes 或类调用的连锁事件。幸运的是,我发现了罪魁祸首并解决了这个问题。不过对于阅读本文的其他人来说,这是很好的一般调试建议。