The title says it all. Have #pragma once been standardized for C++0x? I don't know any compiler that doesn't provide an implementation of it, with almost always the same semantics and name. 
            Asked
            
        
        
            Active
            
        
            Viewed 2,977 times
        
    11
            
            
        
        Brian Tompsett - 汤莱恩
        
- 5,753
 - 72
 - 57
 - 129
 
        Klaim
        
- 67,274
 - 36
 - 133
 - 188
 
- 
                    1See this for a [gotcha in `#pragma once`](http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard/1946730#1946730) – Motti Dec 30 '10 at 19:31
 - 
                    "Almost"? You're fine using it in different compilers that don't treat it identically? Or, what other names do you know it by? (It's unclear to which one the "almost" applies, or both?) – Fred Nurk Jan 01 '11 at 10:01
 
3 Answers
13
            All #pragma directives cause the implementation to behave in an implementation defined way.
This hasn't changed between C++03 and the latest C++0x draft (n3225.pdf). Include guards are the portable alternative.
        CB Bailey
        
- 755,051
 - 104
 - 632
 - 656
 
- 
                    1I know that guards are the portable alternative but I thought it could have been standardized anyway. – Klaim Dec 30 '10 at 14:51
 - 
                    
 - 
                    1@Prasoon: So it is. In my defence, the "current draft" on the WG21 web page is not up to date. http://www.open-std.org/jtc1/sc22/wg21/ – CB Bailey Dec 30 '10 at 15:01
 - 
                    Ok, `#pragma once` can cause problems, but I wonder - why not considering other alternatives, for example `#pragma once ID`, with a user-specified ID? Or am I the only to be disgusted by those copy-pasted ifdef-define-endif lines?.. – Roman L Dec 30 '10 at 20:00
 - 
                    If a kind of #pragma once become standard, that don't forces you to use it on all files, so I don't see the prolem with adding it to the standard (other than giving it a non-pragma name). – Klaim Dec 30 '10 at 21:36
 - 
                    @Klaim: Mostly just because it's completely unnecessary to add that to the language. It can already be done with the features already in the language. – Mooing Duck Apr 09 '15 at 00:42
 
6
            
            
        Sun C++ compiler (Solaris) does not implement it. And no, it's not in C++0x drafts.
        zeuxcg
        
- 9,216
 - 1
 - 26
 - 33
 
-2
            
            
        It's also trivial to implement using #ifdef. What's the guiding principal for the new version? Implement everything you might ever want and the kitchen sink or just give you the minimum tools to do so yourself?
        Jay
        
- 13,803
 - 4
 - 42
 - 69
 
- 
                    8You're missing the point. A big part of sandardisation is to make common practice be the minimal available for standard-compliant tools. As `#pragma once` IS provided by a lot of compilers and has been proved useful. A keyword equivalent standardized would have been helpful. – Klaim Dec 30 '10 at 19:06
 - 
                    6include guards force you to choose names in the (one and only global) preprocessor namespace. which is a pain. granted, most projects need macros somewhere, so they have deal with the issue of choosing preprocessor identifiers without causing collisions anyway. nevertheless it's a pain, and the i still see a lot of #ifdef FILENAME_H code flying around. which is ARGH. most sensible projects use PROJECTNAME_FILENAME_SOMESUFFIX, which is OKish, but well... . IMO #pragma once is just the better solution. – Paul Groke May 23 '12 at 22:54