BOOST_NO_CXX11_HDR_CODECVT confusion
I use BOOST_NO_CXX11_HDR_CODECVT from config.hpp in order to selectively enable code which uses the built-in codecvt facets as opposed to the boost "home brew" one we've been using for a long time. I do similar things with other macros such as BOOST_NO_CXX11_HDR_FORWARD_LIST. Problems arise when I use a recent compiler such as gcc 6.2 with the switch -std=c++03 as in "/hpc-6.2/usr/local/bin/g++" -ftemplate-depth-128 -std=c++03 -O0 -fno-inline -Wall -g -dynamic -gdwarf-2 -fexceptions -fPIC -arch x86_64 -Wno-unused-variable -Wno-long-long -ftemplate-depth-255 -DBOOST_ALL_NO_LIB=1 -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_LIB_DIAGNOSTIC=1 -DBOOST_SERIALIZATION_DYN_LINK=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_WSERIALIZATION_DYN_LINK=1 -I"../../.." -c -o "../../../bin.v2/libs/serialization/test/test_iterators.test/darwin-6.2~03/debug/test_iterators.o" "test_iterators.cpp" In this ease I would expect to find that BOOST_NO_CXX11_HDR_CODECVT is defined as C++ standard does not include <codecvt> headers for versions prior to C++ 11. But the test matrix http://www.boost.org/development/tests/develop/developer/output/Sandia-gcc-6... for this compilers shows that BOOST_NO_CXX11_HDR_CODECVT is NOT defined when no -std=c++03 is used. OK - I see that for gcc 6.2 the default is C++ 14 if no switch is used. So the test matrix is OK. I'm not sure what the column is meant to test as it does specify a particular version as the other columns do. So I think the test for gcc 6.2 - and all the g++/clang compiler would be improved by specifying which version of the C++ standard they are actually testing. But I still have a problem. When I use the swithc -std=c++03 I expect that BOOST_NO_CXX11_HDR_CODECVT be defined as C++ versions prior to C++ 11 don't have header <codecvt>. Same goes for other headers required only for more recent compilers. But my expectations aren't realized as BOOST_NO_CXX11_HDR_CODECVT is not defined in this case. The leads to selection of library code which invokes an #error saying that it's not supported. Perhaps definition of BOOST_NO_CXX11_HDR_CODECVT is conditioned solely on the existence of <codecvt> rather than the existence of <codecvt> and the compiler running in C++ 11+ "mode". I think this is what is messing things up for me. I might be able to work around this if I config.hpp included a macro which indicated which standard version it's intended to support. It doesn't have this. But I wouldn't need it if the BOOST_NO... worked as I would expect. Robert Ramey
On 11/17/2016 1:51 PM, Robert Ramey wrote:
I use BOOST_NO_CXX11_HDR_CODECVT from config.hpp in order to selectively enable code which uses the built-in codecvt facets as opposed to the boost "home brew" one we've been using for a long time. I do similar things with other macros such as BOOST_NO_CXX11_HDR_FORWARD_LIST.
Problems arise when I use a recent compiler such as gcc 6.2 with the switch -std=c++03 as in
"/hpc-6.2/usr/local/bin/g++" -ftemplate-depth-128 -std=c++03 -O0 -fno-inline -Wall -g -dynamic -gdwarf-2 -fexceptions -fPIC -arch x86_64 -Wno-unused-variable -Wno-long-long -ftemplate-depth-255 -DBOOST_ALL_NO_LIB=1 -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_LIB_DIAGNOSTIC=1 -DBOOST_SERIALIZATION_DYN_LINK=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_WSERIALIZATION_DYN_LINK=1 -I"../../.." -c -o "../../../bin.v2/libs/serialization/test/test_iterators.test/darwin-6.2~03/debug/test_iterators.o" "test_iterators.cpp"
In this ease I would expect to find that BOOST_NO_CXX11_HDR_CODECVT is defined as C++ standard does not include <codecvt> headers for versions prior to C++ 11.
Huh ? Where do you get that from ? Please see section 22.2.1.5 of the C++ standard 2003.
But the test matrix http://www.boost.org/development/tests/develop/developer/output/Sandia-gcc-6... for this compilers shows that BOOST_NO_CXX11_HDR_CODECVT is NOT defined when no -std=c++03 is used.
OK - I see that for gcc 6.2 the default is C++ 14 if no switch is used. So the test matrix is OK. I'm not sure what the column is meant to test as it does specify a particular version as the other columns do. So I think the test for gcc 6.2 - and all the g++/clang compiler would be improved by specifying which version of the C++ standard they are actually testing.
But I still have a problem. When I use the swithc -std=c++03 I expect that BOOST_NO_CXX11_HDR_CODECVT be defined as C++ versions prior to C++ 11 don't have header <codecvt>. Same goes for other headers required only for more recent compilers. But my expectations aren't realized as BOOST_NO_CXX11_HDR_CODECVT is not defined in this case. The leads to selection of library code which invokes an #error saying that it's not supported.
Perhaps definition of BOOST_NO_CXX11_HDR_CODECVT is conditioned solely on the existence of <codecvt> rather than the existence of <codecvt> and the compiler running in C++ 11+ "mode". I think this is what is messing things up for me.
I might be able to work around this if I config.hpp included a macro which indicated which standard version it's intended to support. It doesn't have this. But I wouldn't need it if the BOOST_NO... worked as I would expect.
Robert Ramey
In this ease I would expect to find that BOOST_NO_CXX11_HDR_CODECVT is defined as C++ standard does not include <codecvt> headers for versions prior to C++ 11.
Huh ? Where do you get that from ? Please see section 22.2.1.5 of the C++ standard 2003.
OK I mispoke. The <codecvt> header has been around since then. But only starting with C++11 does it include the codecvt_utf8 class. That is what I'm depending on. Robert Ramey
But I still have a problem. When I use the swithc -std=c++03 I expect that BOOST_NO_CXX11_HDR_CODECVT be defined as C++ versions prior to C++ 11 don't have header <codecvt>. Same goes for other headers required only for more recent compilers. But my expectations aren't realized as BOOST_NO_CXX11_HDR_CODECVT is not defined in this case. The leads to selection of library code which invokes an #error saying that it's not supported.
Works for me, invoking gcc 6.1.0 with -std=c++03 results in BOOST_NO_CXX11_HDR_CODECVT being defined as expected. John.
participants (3)
-
Edward Diener
-
John Maddock
-
Robert Ramey