Класс множественного определения в 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
что я делаю не так
с уважением,
@PartnerTech, 👍1
Обсуждение1 ответ
Лучший ответ:
Если вы хотите, чтобы 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
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя
Пожалуйста , покажи нам " .Foo3.cpp "это упоминается в ошибке., @the busybee