Discussion:
Will __GXX_EXPERIMENTAL_CXX0X__ go away?
Patrick Horgan
2011-05-25 06:44:05 UTC
Permalink
I'm using the following in a header that uses typeof and needs to build
in code that builds with -std=c++0x or the default -std=c++98. Can I
leave it and forget it, or will eventually the compiler's use of c++0x
features no longer be experimental? How do I future proof it?

#ifdef __GXX_EXPERIMENTAL_CXX0X__
#define typeof decltype
#endif


Patrick
Jonathan Wakely
2011-05-25 08:19:57 UTC
Permalink
Post by Patrick Horgan
I'm using the following in a header that uses typeof and needs to build
in code that builds with -std=c++0x or the default -std=c++98.  Can I
leave it and forget it, or will eventually the compiler's use of c++0x
features no longer be experimental?  How do I future proof it?
#ifdef __GXX_EXPERIMENTAL_CXX0X__
#define typeof decltype
#endif
Yes it will go away at some point. The portable way to detect C++0x support is:

#if __cplusplus >= 201103L
Jonathan Wakely
2011-05-25 08:21:20 UTC
Permalink
Post by Jonathan Wakely
Post by Patrick Horgan
I'm using the following in a header that uses typeof and needs to build
in code that builds with -std=c++0x or the default -std=c++98.  Can I
leave it and forget it, or will eventually the compiler's use of c++0x
features no longer be experimental?  How do I future proof it?
#ifdef __GXX_EXPERIMENTAL_CXX0X__
#define typeof decltype
#endif
#if __cplusplus >= 201103L
Actually portable is the wrong word, since G++ doesn't actually
conform to that requirement - but it's the method specified by the
standard, so other compilers should conform to it and G++ should do
one day too.
Patrick Horgan
2011-05-25 22:31:53 UTC
Permalink
Post by Jonathan Wakely
Post by Jonathan Wakely
Post by Patrick Horgan
I'm using the following in a header that uses typeof and needs to build
in code that builds with -std=c++0x or the default -std=c++98. Can I
leave it and forget it, or will eventually the compiler's use of c++0x
features no longer be experimental? How do I future proof it?
#ifdef __GXX_EXPERIMENTAL_CXX0X__
#define typeof decltype
#endif
#if __cplusplus >= 201103L
Actually portable is the wrong word, since G++ doesn't actually
conform to that requirement - but it's the method specified by the
standard, so other compilers should conform to it and G++ should do
one day too.
Yeah, the current draft (N3242) has this:
16.8 Predefined macro
names [cpp.predefined]
1 The following macro names shall be defined by the implementation:
_ _ cplusplus
The name _ _ cplusplus is defined to the value 201103L when compiling a
C++ translation unit.155
155) It is intended that future versions of this standard will replace
the value of this macro with a greater value. Non-conforming compilers
should use a value with at most five decimal digits.

right now gcc defines __cplusplus as 1, so maybe something like?

#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
#define typeof decltype
#endif

Patrick
Jonathan Wakely
2011-05-25 22:40:24 UTC
Permalink
The current draft is n3290 but apart from that, yes that should detect
C++0x support

I hope that gcc will eventually define __cplusplus correctly too

Loading...