переведи!
Так они же extern
! Как же Вы их можете не использовать?
Как-то удается обходится без них
Стоп. Ну Вы же только что написали
А теперь, оказывается, без них обходитесь?
Вы уж определитесь, используете Вы extern
сущности или нет.
Если нет, то у Вас нет и не может быть никаких функций в других модулях компиляции.
ну, это если файл с функциями не обозвать по ардуиновски - *.ino )))
А я вот тоже слово extern
нигде не использую, хотя по файлам код раскидываю постоянно. Работает как-то ))
Ты то может и не используешь, но они на самом деле extern.)
Да дело-то ясное, что дело темное ))
Вы его по умолчанию используете.
В объявлении функций слово extern
можно опускать. Они такие по умолчанию. Если в некоторой единице трансляции присутствует объявление функции, то нет его определения, считается, что она находится в другой единице трансляции. А если есть определение без явного указания static
, то её можно линковать к другим единицам трансляции.
ну передергивать-то не надо
Я писал про переменные extern. а не про функции
Из поста №17 это вообще никак не следует и потому я его понял, что Вы не используете эту концепцию вообще и очень удивился.
Переменные многие не используют. Вот такая фигня в модуле – нормальная практика:
...
static int peakCounter = 0;
int peaksCollected(void) {
return peakCounter;
}
....
А если хочется сделать геттер inline
, то используется фокус с пространством имён.
ну как сказать. О том, что что в описании любой функции неявно присутствует модификатор extern - я даже не подозревал. И потому писал только о тех случаях, где слово extern явно присутствует в тексте программы.
Если вернутся к источнику этой дискуссии - я отвечал на пост 15 от @ВладФ , где он предлагал решать проблему незадекларированных переменных путем описания их как extern. Я считаю, что такой подход это костыль и говнокод
С первоначальной настройкой подключения .h и .cpp файлов разобрался.
Проект предполагает большое количество файлов определений и хочется структурировать файлы по вложенным папкам.
Но при попытке перенести файлы во вложенные папки проблема вернулась.
Работа ведётся в Visual Studio Code, с подключенными расширениями “Arduino Community Edition”, “Arduino”.
Есть папка проекта. В ней условно три файла.
Weather_Station_PMA
|__Weather_Station_PMA.ino
|__FanJu.h
|__FanJu.cpp
Подключения файлов прописаны так:
В начале файла Weather_Station_PMA.ino:
#include "FanJu.h"
В файле FanJu.h:
#ifndef FanJu_h
#define FanJu_h
#include <Arduino.h>
...
#endif
В начале файла FanJu.cpp:
#include <Arduino.h>
#include "FanJu.h"
В этом случае всё находится, компилируется, работает.
Пробую перенести FanJu.h и FanJu.cpp во вложенную папку res так:
Weather_Station_PMA
|__res
| |__FanJu.h
| |__FanJu.cpp
|
|__Weather_Station_PMA.ino
Меняю строку подключения в файле Weather_Station_PMA.ino на:
#include "res\FanJu.h"
Проект перестаёт компилироваться. Компилятор не находит функции, описанные в FanJu.cpp, и вызываемые из Weather_Station_PMA.ino. Как правильно перенести файлы .h и .cpp из корневой папки проекта во вложенную папку?
А если так:
#include “res/FanJu.h”
Пробовал, без разницы.
У меня работает и так
#include "src/confetti_pal.h"
#include "src/gradient_palettes.h"
#include "src/juggle_pal.h"
..........................
и вот так
#include "../setting.h"
..........................
Так что тогда разбирайтесь со своими конкретными файлами - только вам известно и что в них написано, и какие конкретно ошибки выдаются
Может это как-то зависеть от среды разработки? У Вас код из под VS Code работает?
Работает
Компилятору по барабану, но
Если функции описаны только в FanJu.cpp
, то их и не должно видеть. Для этого они как минимум должны быть объявлены в файле FanJu.h
Они там объявлены:
#ifndef FanJu_h
#define FanJu_h
#include <Arduino.h>
// Процедуры и функции для организации кольцевого буфера принимаемых битов данных.
void push(uint8_t v);
uint16_t pop();
int16_t fillLvl();
void isr();
void setup_cc1101();
void print_hex(byte inp);
// Процедуры и функции для декодирования данных из кольцевого буфера по протоколу датчиков FANJU.
void decode();
bool chkChkSum(uint8_t *data);
void analyse(uint8_t *data);
#endif
Ругается на isr() и decode(), которые вызываются из .ino
c:/users/user/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32s3-elf-gcc/esp-2021r2-patch5-8.4.0/bin/…/lib/gcc/xtensa-esp32s3-elf/8.4.0/…/…/…/…/xtensa-esp32s3-elf/bin/ld.exe: d:\Projects\ArduinoOutput\sketch\Weather_Station_PMA.ino.cpp.o:(.literal._Z5setupv+0x10): undefined reference to `isr()’
c:/users/user/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32s3-elf-gcc/esp-2021r2-patch5-8.4.0/bin/…/lib/gcc/xtensa-esp32s3-elf/8.4.0/…/…/…/…/xtensa-esp32s3-elf/bin/ld.exe: d:\Projects\ArduinoOutput\sketch\Weather_Station_PMA.ino.cpp.o:(.literal._Z4loopv+0x24): undefined reference to `decode()’
Если файл FanJu.cpp вернуть в корень проекта, а файл FanJu.h оставить во вложенной папке res, то компилятор всё находит, компилирует.
Это ни о чем. Вот так - работает
Weather_Station_PMA.ino
#include "src/FanJu.h"
void setup()
{
Serial.begin(115200);
}
void loop()
{
func();
delay(1000);
}
FanJu.h
#ifndef FanJu_h
#define FanJu_h
#include <Arduino.h>
void func();
#endif
FanJu.cpp
#include <Arduino.h>
#include "FanJu.h"
void func()
{
Serial.println(millis());
}
Оба файла лежат в папке src
А что там наворочено в ваших файлах - я отсюда не вижу