Classe de définition multiple dans Arduino

Nov 27 2020

Aidez-moi ici. Je ne sais pas ce qui me manque. J'ai ce code dans mon IDE arduino

#include "Foo2.h"
void setup() {
  // put your setup code here, to run once:

}
void loop() {
  // put your main code here, to run repeatedly:
}

Et j'ai cinq fichiers: Foo.h, Foo.cpp, Foo2.h, Foo3.cpp et 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()
{
}

Et c'est me donner une erreur:

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

ce que je fais mal

Cordialement,

Réponses

timemage Nov 27 2020 at 08:23

Si vous souhaitez Fooa()être défini dans un en-tête pouvant être inclus dans plusieurs fichiers .cpp, vous devez le déclarer comme une fonction en ligne comme ceci:

#ifndef Foo_H
#define Foo_H

class Foo
{
    public:
    Foo();

    public:
    inline bool Fooa();
    bool Foob();
};
#endif

Alternativement, vous pouvez fournir la définition de fonction directement dans la définition de classe; cela rend également la fonction même inlinesi le inlinemot clé n'est pas requis .

Ou si vous souhaitez conserver Fooaune fonction non en ligne, vous devez déplacer la définition hors de l'en-tête et dans un fichier .cpp comme vous l'avez fait avec Foob().

La création d'une fonction en ligne a un deuxième effet au-delà de l'implication que vous voulez que le code d'une fonction soit généré sur le site d'appel; il informe le compilateur (ou plus précisément l'éditeur de liens) de s'attendre à voir plusieurs définitions (qui doivent être identiques) du code de la fonction. Sans cela avancé remarqué, vous obtiendrez l' multiple definition oferreur lorsqu'une définition de fonction est insérée dans plusieurs fichiers .cpp au moyen d'un fichier #include.

En remarque: #includeest une forme automatisée de copier-coller. Il place logiquement le contenu d'un autre fichier (et toutes ses #includeutilisations accessibles de manière transitoire) à l'endroit où la #includedirective est apparue. Il ne se comporte pas de la même manière que de nombreuses directives similaires dans d'autres langues. Par exemple, #includene se comporte pas comme le importmot-clé, disons Java ou python, par exemple.