I just can't wrap my head around on how to properly work with multiple files. My code has been getting quite big so I decided to split all the classes into one file each. So I'm left with 6 files:
dataHandler.cpp
fileHandler.cpp
header.cpp
main.cpp
request.cpp
sensorData.cpp
header.cpp includes all the header files, and main.cpp the setup() and loop() functions.
Visual Studio Code shows me no errors while compiling. The includeguards have the name convention: CLASSNAME_INCG
So in my main.cpp for example I have something like:
#ifndef HEADER_INCG
#include "header.cpp"
#define HEADER_INCG
#endif
#ifndef SENSORDATA_INCG
#include "SensorData.cpp"
#define SENSORDATA_INCG
#endif
#ifndef DATAHANDLER_INCG
#include "DataHandler.cpp"
#define DATAHANDLER_INCG
#endif
setup()
{
...
}
...
When going into a class-file I have it defined in the following way (fileHandler.cpp):
#ifndef HEADER_INCG
#include "header.cpp"
#define HEADER_INCG
#endif
#ifndef FILEHANDLER_INCG
#define FILEHANDLER_INCG
class FileHandler{
...
}
#endif
So in summary I include the headerfile into every file, with includeguards arround. If I wouldn't include it I would get errors that crucial libaries like Serial etc. are missing. But when including the header into every file compiliing works just fine, but when it comes to linking the files togehter I get an error of multiple definitions.
So how can I define the headerfile just once for all files albeit I need it in every file?
-
you use the guards wrong. see some library for correct use and use .h filesJuraj– Juraj ♦2019年01月05日 09:29:11 +00:00Commented Jan 5, 2019 at 9:29
1 Answer 1
Rule #1:
Header file extension is ".h". Files with ".cpp" are ususally compiled as separate compilation units into the object file. If you have any function definition (= declaration + implementation) or any global variable in more object files, it'll fail to link.Rule #2:
No definitions in headers - variables and functions will cause this error if you include .h file into more .cpp files. If you need super global variable, you have to use declaration with extern modifier and you have to define it in one of the .cpp files. But only one! Also there can be only function prototypes (declarations) in header file. Implementation have to be only once in one of the ".cpp" files.
It's usually in the first chapter of books about learning C/C++.
Really short example:
// myLib.h
#ifndef _myLib_h_guard_
#define _myLib_h_guard_
void myFunction(); // function prototype (declaration)
extern int mySuperGlobalVariable; // variable declared as extern, there must be definition somewhere
class MyClass {
public:
int someMethod(); // method declaration
int anotherMethod() { return 1; } // definition inside of class works, but sometimes is less readable
};
#endif
// myLib.cpp
#include "myLib.h"
void myFunction() { // function implementation (definition)
// do something...
}
int mySuperGlobalVariable; // definition
int MyClass::someMethod() { return 2; } // method definition
// main.cpp
#include <myLib.h>
int main() {
mySuperGlobalVariable = 10;
myFunction();
MyClass instance;
int first = instance.someMethod();
int second = instance.anotherMethod();
}
-
Could you maybe give me an example on how to do this properly? I'm sure this sounds trivial to you but I hardly understand what you've said.Cowboy_Patrick– Cowboy_Patrick2019年01月05日 10:22:20 +00:00Commented Jan 5, 2019 at 10:22
-
Thanks a lot :) I tried to declare and initialize it in myLib.cpp and forgot the extern-keyword in myLib.h.Cowboy_Patrick– Cowboy_Patrick2019年01月05日 10:47:42 +00:00Commented Jan 5, 2019 at 10:47
-
1you can use
#pragma once
instead of the old fashioned#ifndef _myLib_h_guard_
:pJaromanda X– Jaromanda X2019年01月05日 10:54:28 +00:00Commented Jan 5, 2019 at 10:54
Explore related questions
See similar questions with these tags.