Classe de définition multiple dans Arduino
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
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.