Skip to contentSkip to conversation

include guards

DISCUSSION Shriramana Sharma 3 participants 3 messages Jun 15, 2007 – Jun 20, 2007

lore
Share & tools
lore
#0 lore raw

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.

#1 lore raw

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
...
# 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?

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
#2 lore raw
In reply to Shriramana Sharma

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
...
# endif

Recently 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