I know this is probably a primitive topic for most, but I just got into coding in c++ because a simple project I am working on that uses esp8266 which can be programmed using c++. Before this I only had experiemce with python, javascript and typescript.
Now to my problem: I am trying to split my code that is getting longer into multiple files.
I already think that I understand right that each library has a header (.h) file and source (.cpp or .c in case of c) file. The first thing I already have problem with is that as you are defining your functions and classes in the header file and then implementing them in the source file you are repeating yourself with the declarations which is not something I would like. I presume that most IDEs will probably automatically help you with generating or editing the header file automatically as you change code in the source file and I guess I will need to learn to live with it.
Then there's the thing with importing. It may happen that if you create a library it also has some dependencies that it needs to include. But as far as I understand one library shouldn't be included multiple times. So from what I can see most libraries check whether a global variable with an ARBITRARY name that the library chooses itself is not defined and then if that's true it defines that variable to indicate it has been included (the name of the variable is not compketely arbitrary and usually follows LIBRARY_NAME_H
but the convention cannot be really relyed on). When the library includes other library it also needs to check whether the variable of that library that is defined on its import is defined. The main file should also probably check this for every library it includes because it can't know what lins were already imported by libs it imported? Am I getting something wrong or is it sometimes ok for some libraries to be included multiple times. There's the to handle these situations?
I'm going to be that guy: don't bother with writing C++, write Rust. Reading C++ to get the gist of what's going on if you are unlucky enough to need to interface with it is definitely a valuable skill to have, but that's not that common. You're running into one of the issues that's part of the reason I quit that language. At one of my former employers, compiling took so much time because of gathering headers. A bunch of stuff would get recompiled without any header changes and it that xkcd comic of "what are you doing??" "just compiling", was my life. 15 goddamn minutes - no joke. inb4 "rust compiles slower than C++" - the initial compilation, for sure. subsequently it's pretty fast.
Rust has better IDE support, better tooling, actual dependency management, "memory management" (aka borrow checker), more legible syntax, a sane standard library, builtin documentation rendering (docstrings are a real thing), builtin testing support and even doctests (tests that run from the examples given in your docstring), ... It's a modern, memory safe language, with an ever-growing community, will get you jobs, and is IMO much more fun to write than C++.
Edit: yes, rust on the ESP8266 is possible https://github.com/esp-rs
CC BY-NC-SA 4.0
Plus, if you eventually do need or want to learn C++ for some reason, I honestly think that knowing Rust first would be quite helpful.