use*_*566 6 c++ g++ backwards-compatibility
我正在使用g ++ 4.4在linux上编译共享库.如果我可以在库中,我想使用一些C++ 11功能,但我无法更新编译器的版本或需要为我的库用户使用任何特殊的编译器开关.
我有两个问题,我很难找到明确的答案.
如果我使用-std = c ++ 0x或-std = g ++ 0x编译共享库,我保证使用我的库的程序不需要那些开关(假设我没有c ++ 0x功能)头文件)?它似乎有效,但我不想在未来注册微妙的问题.
g ++ 4.4中C++ 11的标准库非常不完整.由于标准库的大部分都是标题库而且gnu的头文件通常都是版本ifdef,我认为可能有一种方法可以使用libstdc ++中至少头文件的更新版本.不过,我不能使用不同的.so.我相信我可以将它们整合在一起,但有可能正确地做这样的事情吗?
谢谢.
1.如果我使用-std = c ++ 0x或-std = g ++ 0x编译共享库,我保证使用我的库的程序不需要那些开关(假设我没有c ++ 0x)头文件中的功能)?它似乎有效,但我不想在未来注册微妙的问题.
C++ 11支持在GCC 4.x版本中仍然是实验性的(它不再是从GCC 5开始的实验).虽然我们试图让事情保持正常,但答案是肯定的,但通常不能保证在所有情况下都能正常工作.由于使用-std=c++0x可能导致混合C++ 03代码和C++ 11代码的程序出现问题,因此有许多ABI更改,有关详细信息,请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility.如果您的图书馆没有导出该页面上描述的任何符号,那么您应该没问题.
2. g ++ 4.4中C++ 11的标准库非常不完整.由于标准库的大部分都是标题库而且gnu的头文件通常都是版本ifdef,我认为可能有一种方法可以使用libstdc ++中至少头文件的更新版本.不过,我不能使用不同的.so.我相信我可以将它们整合在一起,但有可能正确地做这样的事情吗?
不,绝对没有任何机会可行.较高版本的标题使用4.4不支持的功能,即使您可以使用它们,您也需要使用较新版本libstdc++.so.就是不行.
标题不是完整的版本#ifdefs,几乎唯一可以找到的是__GXX_EXPERIMENTAL_CXX0X__你使用时由G ++定义的检查,-std=c++0x但这并不意味着你的4.4版本支持lambdas,非静态数据成员初始化器,正确的右值引用语义,默认/删除的功能等,以后的标题自由使用.您必须将libstdc ++标头与它们附带的相同版本的GCC一起使用.
简而言之,如果您需要适当的C++ 11支持,则需要使用更新的编译器.
如果您不能使用较新的编译器,则无法获得正确的C++ 11支持.