Класс множественного определения в arduino

Помоги мне выбраться отсюда. Я не знаю, чего мне не хватает. У меня есть этот код в моей 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:
}

И у меня есть пять файлов: Foo.h, Foo.cpp , Foo2.h, Foo3.cpp и Фу.х

Фу.х

#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()
{
}

И это выдает мне ошибку:

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

что я делаю не так

с уважением,

, 👍1

Обсуждение

Пожалуйста , покажи нам " .Foo3.cpp "это упоминается в ошибке., @the busybee


1 ответ


Лучший ответ:

0

Если вы хотите, чтобы Fooa() был определен в заголовке, который может быть включен в более чем один файл .cpp, вам нужно будет объявить его как встроенную функцию следующим образом:

#ifndef Foo_H
#define Foo_H

class Foo
{
    public:
    Foo();

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

В качестве альтернативы, вы можете предоставить определение функции непосредственно внутри определения класса; это также делает функцию встроенной, несмотря на то, что ключевое слово inline не требуется.

Или, если вы хотите сохранить Fooa как нестроковую функцию, вам нужно будет переместить определение из заголовка в файл .cpp, как вы сделали с Foob().

Создание встроенной функции имеет второй эффект, помимо того, что подразумевается, что вы хотите, чтобы код функции генерировался на сайте вызова; это информирует компилятор (или, точнее, компоновщик) ожидать увидеть несколько определений (которые должны быть идентичными) кода для функции. Без этого предварительного уведомления вы получите множественное определение ошибки, когда определение функции будет вставлено в файл multiple .cpp с помощью #include.

В качестве дополнительного примечания: #include - это автоматизированная форма копирования и вставки. Он логически помещает содержимое другого файла (и все его доступные #include использует транзитивно) в место, где появилась директива #include . Он ведет себя не так, как многие аналогичные директивы на других языках. Например, #include ведет себя не так, как ключевое слово import, например, в Java или python.

,

Добавление ключевого слова 'inline' не сработало. Я отредактировал часть своего вопроса, потому что у меня есть и другие файлы., @PartnerTech

Я пытаюсь решить эту проблему[https://arduinoprosto.ru/q/79641/problemm-with-the-mpu6050-library ]. И я думаю, что сначала я должен разобраться с этой проблемой., @PartnerTech

Нет, вы были правы, это работает. Я должен поместить ключевое слово 'inline' в Foo.h и Foo2.cpp, @PartnerTech