recursive includes
David Geary
dmg at ssc-vax.UUCP
Fri Mar 3 03:37:00 AEST 1989
From: samperi at marob.MASA.COM (Dominick Samperi)
Message-ID: <570 at marob.MASA.COM>
>Are recursive #includes hazardous to your software's health?
No.
>I'm working on a system where each header file has the form:
><contents of foo.h>:
>#ifndef H_FOO
>#define H_FOO
>defines, declarations, etc.
>#endif
Yes, I do the very same thing.
>This scheme permits header files to be included two or more times, even
>recursively, where the second and subsequent includes of the same file
>will have no effect. (That is, a header file A can include another header
>file B, which in turn includes A, but since H_A will be defined when A
>is included the first time, the second include of A will have no effect,
>and the recursion will end.)
Yup. However, not really recursion, because the recursion never happens.
>Although this trick will avoid the common problems caused by including
>a header file more than once, I suspect that it will also encourage
>the inclusion of files that are not even needed (since there is
>no chance for multiple definitions, if there is some chance that the
>definitions may be needed, what the heck). Furthermore, permitting
I don't see where this would "also encourage the inclusion of files
that are not even needed". It may very well cause some laziness on
a programmers part by including the same file twice, which really
makes no difference, (except for miniscule amount of time to it takes
to open the file and process #ifndef).
>recursive includes may tend to smear the separation between modular
>components of the software system, and designing a correct makefile
>will be a mess.
Maybe this would be true if header files are included that are
not needed, but I don't think that's the case (see above).
>These problems, together with the discovery that some preprocessors
>consider any recursive include to be a fatal error, have motivated me
>to discontinue the use of this trick, and discontinue the use of
>recursive includes as well.
If a preprocessor does not allow the above construct of:
#ifndef FLAG
#define FLAG
stuff...
#endif
Then the compiler is broken. From pages 91 and 92 of K&RV2:
"It is possible to control preprocessing itself with conditional
statements that are evaluated during preprocessing. This provides
a way to include code selectively, depending on the value of
conditions evaluated during compilation...
#ifndef HDR
#define HDR
/* contents of hdr.h go here */
#endif"
If it's good enough for Dennis Ritchie, it's good enough
for me ;-).
David Geary
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ David Geary, Boeing Aerospace, ~
~ #define Seattle RAIN ~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the Comp.lang.c
mailing list