Klasse mit mehreren Definitionen in Arduino

Nov 27 2020

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

timemage Nov 27 2020 at 08:23

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, inlineobwohl das inlineSchlüsselwort nicht erforderlich ist .

Wenn Sie die FooaFunktion 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 ofWenn dies nicht bemerkt wird, wird der Fehler angezeigt, wenn eine Funktionsdefinition über eine in mehrere CPP-Dateien eingefügt wird #include.

Als Randnotiz: #includeist eine automatisierte Form des Kopierens und Einfügens. Es pflanzt logischerweise den Inhalt einer anderen Datei (und alle erreichbaren #includeVerwendungen transitiv) an die Stelle, an der die #includeRichtlinie erschienen ist. Es verhält sich nicht so wie viele ähnlich aussehende Anweisungen in anderen Sprachen. ZB #includeverhält sich beispielsweise nicht wie das importSchlüsselwort beispielsweise in Java oder Python.