+ 13
Include header files which are already included in other header files - Is it necessary?
Hai guys, I have a question here. So I have main.cpp, Linked_list.h and design.h. I already have <iostream> header included into design.h, and my Linked_list.h file includes design.h. If I now include Linked_list.h into main.cpp, do I need to include <iostream> for main.cpp as well? As far as I am concerned, my program is working fine without including <iostream> into main.cpp. TIA
5 Answers
+ 8
Works...vs. future-proofing.
Philosophy: "Include what you use"
http://softwareengineering.stackexchange.com/a/262020
"...always include all headers...used in a .cpp file...regardless of what you know about what's in those files. [Include guards ensure multiple includes don't matter]. [This strategy produces 'clarity' and 'refactor safety']"
Include guards are standard practice; compilers even look for them:
https://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html
Guards prevent reopening the file and the practice is called "multiple include optimization".
Google Code: https://github.com/include-what-you-use/include-what-you-use/blob/master/README.md
"When every file includes what it uses, then it is possible to edit any file and remove unused headers, without fear of accidentally breaking the upwards dependencies of that file. It also becomes easy to automatically track and update dependencies in the source code."
+ 6
The header defines functions.
So defining the header in another,
seems like one folder inside another.
+ 2
Yes, you dont need to double include headers if its already declared in another header that you are using. But its easier to keep track of things if you stick to forward declaring and only declaring headers in cpp files unless you need to do it in a header
+ 1
I had only just noticed my programs using the string class were compiling without including the <string> header. It turns out that <iostream>includes <ios_base> which in turn includes <string>.
Is this bad practice and should I explicitly include <string>? Even if it's just a case of clarity?
Is it safe to assume this applies to more than just the <string> header? Perhaps this is implementation specific and or does the standard state the <string> header be included via <ios_base> and <iostream>? Ensuring that any respected and widely used implementation will always include <string> providing the the call to <iostream> exists.
0
I think I finally have an answer for this.
In a header file, you have
ifndef
//and
endif
ifndef only allows you to define something that has not been defined already.
If it has been defined already,
the code defined inside is skiped and goes straight to endif.
C++ inherited this from C to prevent double defined errors from header files.