Seite 1 von 1
#ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 07:53
von Ozzy
Moin,
ich sitze gerade an einem Qt-Projekt (mit QtCreator erstellt). Nun sollen 2 Dateien eine header einbinden; eigentlich kein Problem:
Zuerst hatte ich das vergessen, und dann kamen natürlich tausend Fehler, dass dieses und jenes schon bekannt wäre. Aber selbst mit diesem eingefügten Code kommen die Fehler immer noch, auch wenn ich schon das Projekt bereinigt habe, alles neu erstellt, sicherheitshalber noch mal qmake ausgeführt habe...
Hat irgendjemand von Euch eine Idee, was ich da noch machen könnte? So etwas hatte ich echt noch nie...
Viele Grüße
Ozzy
Re: #ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 08:00
von Christian81
Da wir weder die Fehlermeldungen noch ein minimales (kompilierbares) Beispiel haben welches das Problem aufzeigt - nein wir können nicht helfen.
Re: #ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 08:15
von Ozzy
Ok, Fehlermeldung ist (z.B.)
gamepad.cpp

Fehler:multiple definition of `CLSID_DirectInput' gamepad.cpp
Fehler:first defined here main.cpp
Und so geht es dann munter weiter. Die main.cpp:
Code: Alles auswählen
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "gamepad.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
die gamepad.h:
Code: Alles auswählen
#ifndef GAMEPAD_H
#define GAMEPAD_H
#include <QtCore/QCoreApplication>
#include <QThread>
#include <windows.h>
#include <string.h>
#include <iostream>
#include <initguid.h>
#include <dinput.h> // DirectInput header
class GamepadThread : public QThread
{
Q_OBJECT
signals:
void sendGamepadData(QList<int> Data);
private:
void run();
private slots:
void getGamepadData();
};
#endif // GAMEPAD_H
Und zum Schluss noch die gamepad.cpp:
Code: Alles auswählen
#include "gamepad.h"
#include <QtGui>
void GamepadThread::run()
{
QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(getGamepadData()), Qt::DirectConnection);
timer.setInterval(100);
timer.start(); // puts one event in the threads event queue
exec();
timer.stop();
}
void GamepadThread::getGamepadData()
{
}
Alle Fehler betreffen die "dinput.h" in der gamepad.h
Viele Grüße
Christoph
Re: #ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 10:42
von Christian81
Das muss ein MSVC - spezifisches Problem sein und hat absolut nichts mit Qt zu tun. Ich würde ein kleines Proggie ohne Qt schreiben und mal bei einem Windows-API - Forum nachfragen.
Re: #ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 11:37
von franzf
Und noch eine kleine Warnung hinten dran:
GAMEPAD_H ist als include-guard EXTREM gefährlich! Include-Guards sollten wirklich einmalig sein. "GAMEPAD" kann in JEDEM Projekt auftauchen, in jeder Konstellation! Da das keine immer wieder verwendeten Konstanten sind, die tipbar sein müssen, solltest du hier wirklich möglichst sicher gehen. Baue ein:
* Projektname
* Klassen-/Headername
* Eindeutige Zeichenkette, die auch nicht lesbar oder deutbar sein muss
* Für den ganz extremen Freak kannst du auch noch den TimeStamp mit anhängen, wann du die Datei erstellt hast.
Z.B.
MY_SPACE_SHOOTER__GAMEPAD__HIUDHSJ__1293908047
Dann kannst du ziemlich sicher sein, dass es zu keinem Konflikt bei den Include-Guards kommt.
Re: #ifndef funktioniert nicht
Verfasst: 20. Oktober 2011 18:01
von Christian81
Oder '#pragma once' - das kann jeder halbwegs aktueller Compiler und man hat keine Probleme mehr.