+ 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?

1st Jun 2024, 6:52 AM
Ketan Lalcheta
Ketan Lalcheta - avatar
7 odpowiedzi
+ 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.
3rd Jun 2024, 2:13 AM
Zaim Aalam
Zaim Aalam - avatar
+ 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
1st Jun 2024, 11:35 AM
john ds
john ds - avatar
+ 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
1st Jun 2024, 12:16 PM
john ds
john ds - avatar
+ 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
2nd Jun 2024, 6:15 PM
john ds
john ds - avatar
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
1st Jun 2024, 11:39 AM
Ketan Lalcheta
Ketan Lalcheta - avatar
0
I had tried with ifndef guard and it still complains about multiple definition
2nd Jun 2024, 1:29 PM
Ketan Lalcheta
Ketan Lalcheta - avatar
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...!
3rd Jun 2024, 3:34 PM
Ketan Lalcheta
Ketan Lalcheta - avatar