#import, #pragma once yadda yadda mumble grumble
Jonathan Lennox
lennox@cs.columbia.edu
Wed Jul 30 04:56:00 GMT 2003
On Tuesday, July 29 2003, "Jonathan Lennox" wrote:
> I hope so too, but I have a few questions about semantics of #import /
> #pragma once (which have always been the matter of much debate).
And by reading the code I can answer my own questions...I've provided my
answers here to a) answer them for others, and b) make sure I read things
right.
> 1) What definition of "the same file" are you using? When you say you "it
> doesn't second-guess the filesystem", do you mean that the rule is just
> "same absolute path, before any link or .. resolution"? There are cases
> where that would break, but they would -- arguably -- deserve to be broken.
The definition is "either a hash table hit (same search path position and
filename) or the same last-modified date (st_mtime) and same content",
with the "same content" check optimized by checking the file's length. I
like that, nice and simple, and very portable; the last-modified date is
almost certainly the one piece of file meta-data supported by every
filesystem implemented.
> 2) What happens if you mix #include and #import of the same file?
Nothing in particular; #import behavior is only affected by previous #import
directives, not by #include, and #include ignores any previous #import's.
> 3) If you #import a file to a PCH file, and then later use the PCH file and
> also re-#import the file outside of the PCH file, what happens? What if
> it's on another host? (This could definitely fall into the category of
> "deserves to break".)
It still uses the same definition of sameness as above. So PCH'ing an
#import'ed file, modifying it, and using both the PCH file and the #imported
file -- or switching the PCH file to another machine where the headers were
installed at a different time -- can potentially bring the file in twice.
This is probably the right thing to do, though it might be nice if this
could be warned for.
> These cases should probably be documented in the CPP manual (even if it's
> just to explicitly make some behavior undefined).
Still think this. :-)
--
Jonathan Lennox
lennox at cs dot columbia dot edu
More information about the Gcc
mailing list