Ihor
есть идеи? вроде же все правильно выглядит
Ihor
что-то не так с namespace undefined reference to `Config::getClientId()' в таком коде, если вынести Config_t config; void setup() { Logger::init(115200); String id = Config::getClientId(); config.id = id; // Config::init(&config); }
Ihor
хотя в этом примере Logger тоже namespace и он работает, но отличие в том что сам код функции в Logger находится в .h файле, а в Config есть отдельный config.cpp но вроде как можно же обявить namespace и его функции в .h файле а сами тела функций в .cpp файле или нет?
Ihor
если я в .h файле буду все писать тела функций будут инлайнится, правильно?
Andrey
В header файлах обычно пишутся прототипы функций
Ihor
да, я так и сделал
romanetz
В header файлах обычно пишутся прототипы функций
Но я встречал и такой вариант, да
Ihor
у меня еще есть rtos оболочка, и там есть namespace task в которого есть .h и .cpp файл и все работает #include <Arduino.h> #include <config/config.h> #include <logger.h> #include <rtos.h> Config_t config; void myTask(void *arg) { while (true) { Task::delay(2000); } } void setup() { Logger::init(115200); // String id = Config::getClientId(); // config.id = id; // Config::init(&config); Task::create(myTask, "task"); } void loop() { }
romanetz
Когда в заголовочниках вообще всё
Ihor
Может дело в том что компилятор не может связать config.h и config.cpp файл между собой?
Ivansuper
есть идеи? вроде же все правильно выглядит
А нормально что ты в сишном хедере пишешь неймспейсы, которые принадлежат плюсам?
romanetz
.hpp предлагаешь?
Ihor
Ivansuper
Попробовать стоит
Andrey
config.hpp
romanetz
Попробовать стоит
Опять же, в Qt такого дофига, я там hpp не видел
Ivansuper
Опять же, в Qt такого дофига, я там hpp не видел
Ну, наверно от компилятора зависит конкретного
Ihor
pltformio, esp32, arduino framework
romanetz
В Qt под Винду используется mingw
Andrey
Хотя пофиг, вообще без расширения инклудится в плюсах
Ihor
нет, та же ошибка, не собралось
Ivansuper
нет, та же ошибка, не собралось
Стоп. А ты config.h заинклюдил туда где имплементации этих функций написаны?
romanetz
я не сильно шарю что в С что с CPP, а как правильно будет?
Тогда зачем себе трудности на ровном месте устраивать?
Andrey
Вообще если неймспейс должно быть ns::class::func
Ivansuper
да
А там имплементации прописаны с пространством имен?
Ihor
А там имплементации прописаны с пространством имен?
да namespace Config { void init(Config_t *config); String getClientId(); }
Ivansuper
Про .схх файл
Ihor
Про .схх файл
#include <config/config.h> void Config::init(Config_t *config) { config->id = getClientId(); } String Config::getClientId() { String id; uint8_t mac[6]; WiFi.macAddress(mac); for (uint8_t i = 0; i < 6; ++i) { id += String(mac[i], HEX); } return id; }
Ivansuper
Так. У тебя конфиг в подпапке. Сорцы из подпапки компилятором видятся?
Ihor
у меня config в platformio include папке, logger и rtos, КСТАТИ, у меня в lib папке и там все хорошо, а в include что-то странное с .cpp файлами
Ihor
сами .h из include прекрасно видятся, а вот связка .h -> .cpp видимо нет
Ivansuper
У тебя возможно подпапковые схх файлы не попадают на компиляцию и в итоге линковщик не находит имплементации этих функций
Andrey
Я понял :) у вас похоже линкер матерится :)))
Andrey
Реализации этой функции нету
Ihor
когда-то читал что в Platformio конфиге есть варианты линковки либ, сейчас попробую разные варианты
Ihor
нет, ничего не помогло: https://docs.platformio.org/en/latest/librarymanager/ldf.html#dependency-finder-mode
Ihor
а у вас был опыт platformio и cpp файлов в папке include ?
Ivansuper
а у вас был опыт platformio и cpp файлов в папке include ?
Эээм. Папка инклюд не для срр файлов
Andrey
Ну я лет 10 на Си пишу...
Ihor
Эээм. Папка инклюд не для срр файлов
я понял.... сам coinfg.cpp нужно писать в /src папке, возле main.cpp а заголовки в include/config.h
Ivansuper
Если ты не используешь платформио библиотеки, то рекомендую сложить все файлы с/срр в главную директорию
Ivansuper
я понял.... сам coinfg.cpp нужно писать в /src папке, возле main.cpp а заголовки в include/config.h
Ага. Сама линковка произойдет потому что срр будет включать тот хедер, и граф связок имен сойдется
Ihor
да, все работает, всем спасибо!) бредово немного и не удобно, h файлы в одном месте cpp в другом..
Ihor
😂
Ihor
а в platformio или самом arduino ide или самом cpp в контексте микроконтролеров есть нормальные модули?? что это за прикол с глобальной кашой по всему проекту? создал переменную - вот тебе сразу глобальный скоп
Ivansuper
Это надо читать про виды хранения (к сожалению забыл как называется правильно)
Ihor
static
аааа.. то есть ставлю статик и он будет локально в файле?
Ihor
а нет что-то типа export?)
Ivansuper
аааа.. то есть ставлю статик и он будет локально в файле?
Да. Почитай все таки на досуге про язык. Так проще будет ориентироваться
Ivansuper
а нет что-то типа export?)
А что оно должно выполнять?
Ihor
export class .. и т.д
Ivansuper
Не понял
Ivansuper
Есть extern, который явно указывает, что имплементация валяется где угодно, только не в этом же файле
Ihor
ну написал я export class A {} Значит его можно имортировать где нужно
Ivansuper
Понял. Смотри
Ivansuper
Ты делаешь хедер, там описываешь прототип класса. Потом ты этот хедер "импортируешь" везде где он нужен
Ivansuper
Но один из импортеров должен предоставить его реализацию. Иначе линковщик увидит только каркас
Ivansuper
Ты видимо хотел что-то типа Java import
Ihor
ну например у меня есть один .h файл и в нем 2 класса если я заимпортирую этот файл то мне попадает сразу 2 класса а я хотел один
Ivansuper
ну я из js... )
Тогда крепись
Ihor
😂
Ihor
как-то же js на cpp написали)
Ihor
ну я уже понял.. спасибо, буду читать!)
Ihor
а еще такой, последний вопрос есть у меня wifi на esp32, все вы знаете хочу сделать оболчку для него с нужными мне методами, чтобы не дергать по всему проекту родной WiFi.h класс мне не нужен в принципе потому что я же не могу создать 2-3 инстанса wifi, точней в принципе то могу, но работать оно не будет я хочу сделать namespace, но внутри namespace мне нужно будет создать приватные переменные которые мне нужны для реализации всего что нужно, но на ружу я не хочу их пускать, в таком случае использовать static в этих переменных/методах или лучше все таки сделать класс хоть и он будет в одном инстансе на проекте?
Ihor
тоже самое касается оболочки на sd карту и всего такого что физически есть только в одном экземпляре
Ivansuper
Т.о. они не вылезут по видимости
Ihor
а правильно если я сделаю это в namespace или по канонам cpp лучше в классе?
Ivansuper
Эм, тебе не обязательно притягивать им неймспейс
Ivansuper
Если ты сделаешь их в классе, тогда у тебя на каждый инстанс будет свои приватные переменные
Ivansuper
Все что вне классов/структур будет только одно на все инстансы