Klasse mit mehreren Definitionen in Arduino
Hilf mir hier raus. Ich weiß nicht, was ich vermisse. Ich habe diesen Code in meiner Arduino IDE
#include "Foo2.h"
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
Und ich habe fünf Dateien: Foo.h, Foo.cpp, Foo2.h, Foo3.cpp und Foo.h
Foo.h
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
bool Fooa();
bool Foob();
};
#endif
Foo.cpp
#include "Foo.h"
Foo::Foo()
{
}
bool Foo::Foob()
{
return true;
}
Foo2.h
#ifndef Foo2_H
#define Foo2_H
#define LIBRARY_VERSION 1.0.0
#include "Foo.h"
bool Foo::Fooa()
{
return true;
}
#endif
Foo3.h
#ifndef Foo3_H
#define Foo3_H
#include "Foo2.h"
class Foo3
{
public:
Foo3();
Foo _foo;
};
#endif
Foo3.cpp
#include "Foo3.h"
Foo3::Foo3()
{
}
Und es gibt mir einen Fehler:
libraries\Foo\Foo3.cpp.o (symbol from plugin): In function `Foo::Fooa()':
(.text+0x0): multiple definition of `Foo::Fooa()'
sketch\kk2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
was ich falsch mache
Grüße,
Antworten
Wenn Sie Fooa()
in einem Header definiert werden möchten , der in mehr als einer CPP-Datei enthalten sein kann, müssen Sie ihn wie folgt als Inline-Funktion deklarieren:
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
inline bool Fooa();
bool Foob();
};
#endif
Alternativ können Sie die Funktionsdefinition direkt in der Klassendefinition bereitstellen. Dadurch wird die Funktion auch ausgeführt, inline
obwohl das inline
Schlüsselwort nicht erforderlich ist .
Wenn Sie die Fooa
Funktion als Nicht-Inline-Funktion beibehalten möchten , müssen Sie die Definition wie zuvor aus dem Header in eine CPP-Datei verschieben Foob()
.
Das Inline-Erstellen einer Funktion hat einen zweiten Effekt, der nicht nur impliziert, dass der Code einer Funktion am Aufrufort generiert werden soll. Es informiert den Compiler (oder genauer den Linker) darüber, dass mehrere Definitionen (die identisch sein müssen) des Codes für die Funktion zu erwarten sind. multiple definition of
Wenn dies nicht bemerkt wird, wird der Fehler angezeigt, wenn eine Funktionsdefinition über eine in mehrere CPP-Dateien eingefügt wird #include
.
Als Randnotiz: #include
ist eine automatisierte Form des Kopierens und Einfügens. Es pflanzt logischerweise den Inhalt einer anderen Datei (und alle erreichbaren #include
Verwendungen transitiv) an die Stelle, an der die #include
Richtlinie erschienen ist. Es verhält sich nicht so wie viele ähnlich aussehende Anweisungen in anderen Sprachen. ZB #include
verhält sich beispielsweise nicht wie das import
Schlüsselwort beispielsweise in Java oder Python.