You should never include a cpp file ( or anything that is not a header ). If you want to compile a file, pass it to the compiler. If you both #include and compile a source file, you'll get multiple definition errors. When you #include a file, its contents are copied verbatim at the place of inclusion.
You make the declarations in a header file, then use the #include directive in every . cpp file or other header file that requires that declaration. The #include directive inserts a copy of the header file directly into the . cpp file prior to compilation.
If you #include a cpp file in several other files in your program, the compiler will try to compile the cpp file multiple times, and will generate an error as there will be multiple implementations of the same methods.
In C program should necessarily contain the header file which stands for standard input and output used to take input with the help of scanf() and printf() function respectively.
What include
does is copying all the contents from the file (which is the argument inside the <>
or the ""
), so when the preproccesor finishes its work main.cpp
will look like:
// iostream stuff
int foo(int a){
return ++a;
}
int main(int argc, char *argv[])
{
int x=42;
std::cout << x <<std::endl;
std::cout << foo(x) << std::endl;
return 0;
}
So foo will be defined in main.cpp
, but a definition also exists in foop.cpp
, so the compiler "gets confused" because of the function duplication.
There are many reasons to discourage including a .cpp file, but it isn't strictly disallowed. Your example should compile fine.
The problem is probably that you're compiling both main.cpp and foop.cpp, which means two copies of foop.cpp are being linked together. The linker is complaining about the duplication.
When you say #include "foop.cpp"
, it is as if you had copied the entire contents of foop.cpp
and pasted it into main.cpp
.
So when you compile main.cpp
, the compiler emits a main.obj
that contains the executable code for two functions: main
and foo
.
When you compile foop.cpp
itself, the compiler emits a foop.obj
that contains the executable code for function foo
.
When you link them together, the compiler sees two definitions for function foo
(one from main.obj
and the other from foop.obj
) and complains that you have multiple definitions.
This boils down to a difference between definitions and declarations.
Headers generally contain declarations; cpp files contain definitions. When you include a file with definitions more than once, you get duplicates during linking.
In your situation one defintion comes from foo.cpp
, and the other definition comes from main.cpp
, which includes foo.cpp
.
Note: if you change foo
to be static
, you would have no linking errors. Despite the lack of errors, this is not a good thing to do.
You should just include header file(s).
If you include header file, header file automatically finds .cpp file. --> This process is done by LINKER.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With