include guards
Hello.
To prevent header files from being included more than once in the same translation unit, we use include guards like
# ifndef FOO_H # define FOO_H ... # endif
Recently I came to know that I can use simply:
# pragma once
instead of the above group of sentences and the desired effect is still accomplished.
This leads me to think of two things:
1. why use the ifndef-define-endif method when the pragma once method is simpler and cleaner?
2. why should we need to use either method at all? If it is a universally undesirable behaviour that the same header file is included in a translation unit more than once, then an intelligent compiler (or preprocessor) itself can by default take of this, right?
I understand that to write portable code that compiles on not-so-intelligent compilers, we may need to do something manually, so question 2 is answered, but question 1 still stands...
Shriramana Sharma.
Hello Shriramana,
Quoted 22 lines · On Fri, 15 Jun 2007 09:13:59 +0530 Shriramana Sharma <[email protected]> wrote:
Hello.
To prevent header files from being included more than once in the same translation unit, we use include guards like
# ifndef FOO_H # define FOO_H ... # endifRecently I came to know that I can use simply:
# pragma onceinstead of the above group of sentences and the desired effect is still accomplished.
This leads me to think of two things:
1. why use the ifndef-define-endif method when the pragma once method is simpler and cleaner?
Quoted 8 lines
2. why should we need to use either method at all? If it is a universally undesirable behaviour that the same header file is included in a translation unit more than once, then an intelligent compiler (or preprocessor) itself can by default take of this, right?
I understand that to write portable code that compiles on not-so-intelligent compilers, we may need to do something manually, so question 2 is answered, but question 1 still stands...
#pragma is simply not supported by all pre-processors, is that directive present in any standard at least?
Regards,
Signature · 1 line
wwp
Shriramana,
Please see inline. Thanks.
Quoted 14 lines · Shriramana Sharma
Hello.
To prevent header files from being included more than once in the same translation unit, we use include guards like
# ifndef FOO_H # define FOO_H ... # endifRecently I came to know that I can use simply:
# pragma once
Quoted 7 lines
instead of the above group of sentences and the desired effect is still accomplished.
This leads me to think of two things:
1. why use the ifndef-define-endif method when the pragma once method is simpler and cleaner?
pragma(s) are, as most language extensions, not portable.
Quoted 4 lines
2. why should we need to use either method at all? If it is a universally undesirable behaviour that the same header file is included in a translation unit more than once, then an intelligent compiler (or preprocessor) itself can by default take of this, right?
Yes, if a header file is contained entirely in a #ifndef' conditional, then the preprocessor records that fact. But if a subsequent #include' specifies the same file, and the macro in the #ifndef is already defined, then the file is entirely skipped, without even reading it. How else should a preprossessor deal with this in a portable manner? Keep in mind that preprocessing is a distinct step in the compilation process.
Quoted 3 lines
I understand that to write portable code that compiles on not-so-intelligent compilers, we may need to do something manually, so question 2 is answered, but question 1 still stands...
Does it? Correct, pragmas are not standard, and probably never will be, due to the difficulty of specifying exactly what it is that '#pragma once' is supposed to do. (Think of two identical copies of a header file in different source directories, and a translation unit that #includes both of them. What is the effect of '#pragma once' here?) Inclusion safe guards work perfectly well, are standard-compliant and portable.
\Steve
--
Steve Grägert <[email protected]>
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html