+ 2
header only implementation
Hi If I am not wrong, header only implementation is the header file where implementation is defined in a header file without the need of cpp file. If so, don't we get repeated function definition when header is included into two cpp files?
7 Answers
+ 3
Yes. Header-only implementation refers to the practice of defining both the declarations and definitions of functions or classes within header files (.h or .hpp), eliminating the need for separate .cpp files.
When a header file with function implementations is included in multiple .cpp files, it can lead to duplicated function definitions, giving linker errors. To avoid this, you can use the `inline` keyword for function definitions in the header file.
+ 2
yes you will get errors and it's better to avoid doing this.
There is a solution, named include guards and it prevents include the same file twice. This working by define macros and check if macros are defined. The first time you will include a header the macro will not be defined so compiler will get the container of the header, if attempt to include it 2nd time, it see that macro is defined already and will ignore this header. Here is a example header with include guards:
#ifndef MY_HEADER_NAME
#define MY_HEADER_NAME
void aFunction()
{
}
#endif
+ 1
Ketan Lalcheta yes correct. If you have in header just simple functions you not have to worry for any issue. But if you have functions with static variables or have declarated any non-constant variables in the header, each cpp file will have its own instances
This is why i tell you to avoid do this, until you understand 100% how it works
+ 1
Ketan Lalcheta what exactly is defined multiple times? Can you show the exact error message?
Try make all your functions in header static, i think this will solve your problem
0
This guards protect double inclusion in single file. Isn't it? This guards do not protect the header getting included in different cpp files.
I had used #pragma once in header to achieve the same. Let me try with ifndef but I feel it will not solve the problem
0
I had tried with ifndef guard and it still complains about multiple definition
0
Hi John
Below is the error I am getting:
Error LNK2005 "void __cdecl printone(void)" (?printone@@YAXXZ) already defined in externHeader1.obj Project1
I don't want to have all those as static. Is it must to have methods as static? If header only implementation has this limitations, then we dont have any other option and then header only is not the proper thing IMO.
Hi EliteAI
Marking it as inline solved the issue for me. I am having a very less code in function defined in header and that's why I am ok to have inline. If code is lengthy, then we should not have inline keyword used. Is it a norm to use small functions in header only implementation? If not, is there any other alternative apart from inline? I am just checking all the possibilities to have a better idea. Many thanks...!