Gennaro Prota wrote:
You are missing the point here. "#pragma once" is not really "functional", in the sense that it's not (or should not be) used *alone* to realize the "include me once" effect. That effect is better achieved by the canonical include guards that should be used anyway (and *will* be used anyway in portable code).Hmm... frankly I haven't used it anymore. I'm under the impression they have fixed it now, but last time I checked it had a lot of bugs. It was easy, for instance, to end up including the same file twice if it was reached through different paths (e.g.: #include "subdir/file.h" in A.cpp and #include "file.h" in subdir/file2.h). Usually one doesn't notice the error, because he uses both the pragma and the canonical include guard, but that means of course that the speed gain comes to nothing. Probably it was VC++ 5.0 though.
"#pragma once" is just an optimization issue. If a file is included a second time in the same TU, a dumb compiler will re-open it and give it to the preprocessor who strips its contents entirely because the include guard is already defined. Re-opening + preprocessing takes little but significant time.
With the "#pragma once" the programmer just gives an hint to the compiler that re-opening is unnecessary and ignores the #include directive immediately. You see, there *is* a speed gain even in the presence of canonical include guards.
Of course, a smarter compiler like g++ will recognize the canonical include guards and deduce that re-opening is unnecessary without any explicit hint given by the programmer.
I agree, but we can't give the burden of avoiding multiple inclusions to the "user". Realistically, with large projects such intent is hardly achievable by anyone.[...] In effect, the whole story about file inclusion should be the other way round: any source file is included at most once for each TU, unless the programmer requires otherwise ;-)
Alberto
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost