g ++ -std = c ++ 0x和兼容性

时间:2012-11-14 16:38:05

标签: c++ g++ backwards-compatibility

我正在使用g ++ 4.4在linux上编译共享库。如果我可以在库中使用某些C ++ 11功能,但是我无法更新编译器的版本或者需要为我的库用户提供任何特殊的编译器开关。

我有两个问题,我无法找到明确的答案。

  1. 如果我使用-std = c ++ 0x或-std = g ++ 0x编译共享库,我保证使用我的库的程序不需要那些开关(假设我没有)头文件中的c ++ 0x功能)?它似乎有效,但我不想在未来注册微妙的问题。

  2. g ++ 4.4中C ++ 11的标准库非常不完整。由于标准库的大部分都是标题库而且gnu的头文件通常都是版本ifdef,我认为可能有一种方法可以使用libstdc ++中至少头文件的更新版本。不过,我不能使用不同的.so。我确信我可以将它们整合在一起,但是可以正确地做这样的事吗?

  3. 感谢。

2 个答案:

答案 0 :(得分:5)

  

1。如果我使用-std = c ++ 0x或-std = g ++ 0x编译共享库,我保证使用我的库的程序不需要那些开关(假设我没有c ++ 0x功能)头文件)?它似乎有效,但我不想在未来注册微妙的问题。

C ++ 11支持在GCC 4.x版本中仍然是实验性的(它不再是从GCC 5开始的实验)。虽然我们试图让事情保持正常,但答案是肯定的,但通常不能保证在所有情况下都能正常工作。使用-std=c++0x导致的许多ABI更改可能会导致混合C ++ 03代码和C ++ 11代码的程序出现问题,有关详细信息,请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility。如果您的图书馆没有导出该页面上描述的任何符号,那么您应该没问题。

  

2。 g ++ 4.4中C ++ 11的标准库非常不完整。由于标准库的大部分都是标题库而且gnu的头文件通常都是版本ifdef,我认为可能有一种方法可以使用libstdc ++中至少头文件的更新版本。不过,我不能使用不同的.so。我相信我可以将它们整合在一起,但有可能正确地做这样的事情吗?

不,绝对没有任何机会可行。更高版本的标题使用4.4不支持的功能,即使您可以使用它们,也需要使用较新的libstdc++.so。只是没有。

标题完整版本#ifdefs,几乎唯一可以找到的是__GXX_EXPERIMENTAL_CXX0X__的检查,当您使用{{1}时由G ++定义但这并不意味着你的4.4版本支持lambdas,非静态数据成员初始化器,正确的右值引用语义,默认/删除函数等,以后的标题可以自由使用。您必须将libstdc ++标头与其随附的相同GCC版本一起使用。

简而言之,如果您需要正确的C ++ 11支持,则需要使用更新的编译器。

如果您无法使用较新的编译器,则无法获得正确的C ++ 11支持。

答案 1 :(得分:3)

我不会尝试这个。所需要的只是在标头中使用一个C ++ 11定义的宏来更改类或函数的定义,并且最终用户将违反单定义规则。这些用途可能是我想象的非常微妙。

然后在类似的说明中,C ++ 11中不再存在vector(count, item = T())构造函数(它现在是两个构造函数)。

简而言之,您必须非常小心您在库中使用的标准库组件,以避免违反一个定义规则,我无法想象破坏的风险值得使用这些功能。

可以做的是使用boosttr1来填补语言空白,直到您可以使用新的编译器和/或被允许要求您的结束 - 用户使用C ++ 11支持进行编译。