Выделение функций в отдельные файлы (.cpp и .h)

переведи!

Так они же extern! Как же Вы их можете не использовать?

Как-то удается обходится без них

Стоп. Ну Вы же только что написали

А теперь, оказывается, без них обходитесь?

Вы уж определитесь, используете Вы extern сущности или нет.

Если нет, то у Вас нет и не может быть никаких функций в других модулях компиляции.

ну, это если файл с функциями не обозвать по ардуиновски - *.ino )))

А я вот тоже слово extern нигде не использую, хотя по файлам код раскидываю постоянно. Работает как-то ))

1 лайк

Ты то может и не используешь, но они на самом деле extern.)

1 лайк

Да дело-то ясное, что дело темное ))

1 лайк

Вы его по умолчанию используете.

В объявлении функций слово extern можно опускать. Они такие по умолчанию. Если в некоторой единице трансляции присутствует объявление функции, то нет его определения, считается, что она находится в другой единице трансляции. А если есть определение без явного указания static, то её можно линковать к другим единицам трансляции.

1 лайк

ну передергивать-то не надо
Я писал про переменные extern. а не про функции

Из поста №17 это вообще никак не следует и потому я его понял, что Вы не используете эту концепцию вообще и очень удивился.

Переменные многие не используют. Вот такая фигня в модуле – нормальная практика:

...
static int peakCounter = 0;

int peaksCollected(void) {
   return peakCounter;
}
....

А если хочется сделать геттер inline, то используется фокус с пространством имён.

ну как сказать. О том, что что в описании любой функции неявно присутствует модификатор extern - я даже не подозревал. И потому писал только о тех случаях, где слово extern явно присутствует в тексте программы.

Если вернутся к источнику этой дискуссии - я отвечал на пост 15 от @ВладФ , где он предлагал решать проблему незадекларированных переменных путем описания их как extern. Я считаю, что такой подход это костыль и говнокод :slight_smile:

С первоначальной настройкой подключения .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

А что там наворочено в ваших файлах - я отсюда не вижу

1 лайк