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 inline
si le inline
mot clé n'est pas requis .
Ou si vous souhaitez conserver Fooa
une 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 of
erreur lorsqu'une définition de fonction est insérée dans plusieurs fichiers .cpp au moyen d'un fichier #include
.
En remarque: #include
est une forme automatisée de copier-coller. Il place logiquement le contenu d'un autre fichier (et toutes ses #include
utilisations accessibles de manière transitoire) à l'endroit où la #include
directive est apparue. Il ne se comporte pas de la même manière que de nombreuses directives similaires dans d'autres langues. Par exemple, #include
ne se comporte pas comme le import
mot-clé, disons Java ou python, par exemple.