GCC support for C++ noexcept
Edward Diener
eldlistmailingz@tropicsoft.com
Mon Jul 27 23:18:00 GMT 2015
On 7/27/2015 6:40 PM, Jonathan Wakely wrote:
> On 27 July 2015 at 21:22, Edward Diener wrote:
>> On 7/27/2015 10:57 AM, Jonathan Wakely wrote:
>>>
>>> On 27 July 2015 at 14:48, Edward Diener wrote:
>>>>
>>>> On 7/27/2015 4:34 AM, Jonathan Wakely wrote:
>>>>>
>>>>>
>>>>> On 27 July 2015 at 05:17, Edward Diener wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> Try
>>>>>>
>>>>>> #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
>>>>>> // C++11 is in effect
>>>>>> #endif
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> GCC 4.8 defines __cplusplus to the correct YYYYMMDD value so this is
>>>>> not necessary.
>>>>>
>>>>
>>>> I meant it as a general solution for any version of gcc. It is what Boost
>>>> config uses.
>>>
>>>
>>> But it doesn't help if you run the preprocessor in C mode not C++,
>>> since neither will be defined :-)
>>
>>
>> How is it possible to be compiling for C++11 when running in C mode ?
>>
>> In other words it does work since a C++11 compile will never be defined when
>> running in C mode, which is certainly what is wanted.
>
> See the first mail in the thread, which attempted to use the
> preprocessor to detect whether C++11 is supported like so:
>
> $ g++ -std=c++11 -dM -E - < /dev/null | grep cplusplus
> cc1.exe: warning: command line option '-std=c++11' is valid for
> C++/ObjC++ but not for C [enabled by default]=
>
> This is running the preprocessor in C mode. Checking for
> __GXX_EXPERIMENTAL_CXX0X__ here won't help, because it's still using
> the preprocessor in C mode, i.e. this still fails:
>
> $ g++-4.4.7 -std=c++0x -dM -E - < /dev/null | egrep 'cplusplus|EXPERIMENTAL'
> cc1: warning: command line option "-std=c++0x" is valid for C++/ObjC++
> but not for C
>
> Whereas this works, because it runs the preprocessor in C++ mode:
>
> $ g++-4.4.7 -std=c++0x -dM -E -x c++ - < /dev/null | egrep
> 'cplusplus|EXPERIMENTAL'
> #define __GXX_EXPERIMENTAL_CXX0X__ 1
> #define __cplusplus 1
>
> That's what I meant about running the preprocessor in C mode, not C++ mode.
>
I see your point. The code I mentioned should really be:
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__cplusplus) &&
__cplusplus >= 201103L
// C++11 is in effect
#endif
More information about the Gcc-help
mailing list