C++ g++-std=c++;0x与兼容性

C++ g++-std=c++;0x与兼容性,c++,g++,backwards-compatibility,C++,G++,Backwards Compatibility,我正在使用g++4.4在linux上编译一个共享库。如果可以的话,我想在库中使用一些C++11功能,但我不能更新编译器的版本,也不能要求库用户使用任何特殊的编译器开关 我有两个问题,我很难找到一个明确的答案 如果我使用-std=c++0x或-std=g++0x编译共享库,是否可以保证使用我的库的程序不需要这些开关(前提是头文件中没有c++0x功能)?这似乎是可行的,但我不想在未来的道路上遇到微妙的问题 g++4.4中C++11的标准库非常不完整。由于大多数标准库都是头文件,gnu的头文件通常都是

我正在使用g++4.4在linux上编译一个共享库。如果可以的话,我想在库中使用一些C++11功能,但我不能更新编译器的版本,也不能要求库用户使用任何特殊的编译器开关

我有两个问题,我很难找到一个明确的答案

  • 如果我使用-std=c++0x或-std=g++0x编译共享库,是否可以保证使用我的库的程序不需要这些开关(前提是头文件中没有c++0x功能)?这似乎是可行的,但我不想在未来的道路上遇到微妙的问题

  • g++4.4中C++11的标准库非常不完整。由于大多数标准库都是头文件,gnu的头文件通常都是ifdef版本,我认为可能有一种方法可以使用libstdc++中最新版本的头文件。我不能用不同的。不过,我想用它。我相信我可以把这两件事混在一起,但这样做对吗


  • 谢谢。

    我不会尝试这个。只需在头中定义一个C++11宏即可更改类或函数的定义,最终用户将违反“一个定义”规则。我想这些用途可能极其微妙

    还有一个类似的注释,C++11中不再存在的
    向量(count,item=T())
    构造函数(现在是两个构造函数)

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

    您可以使用
    boost
    tr1
    填补语言空白,直到您可以使用新的编译器和/或允许您的最终用户使用C++11支持进行编译

    一,。如果我使用-std=c++0x或-std=g++0x编译共享库,是否可以保证使用我的库的程序不需要这些开关(前提是头文件中没有c++0x功能)?这似乎是可行的,但我不想在未来的道路上遇到微妙的问题

    C++11支持在GCC4.x版本中仍然是实验性的(从GCC5开始不再是实验性的)。虽然我们试图让事情继续运转,但答案是否定的,你不能保证在所有情况下都能工作。使用
    -std=c++0x
    会导致许多ABI更改,这些更改可能会导致混合使用c++03代码和c++11代码的程序出现问题,有关详细信息,请参阅。如果您的库没有导出该页上描述的任何符号,那么您应该可以

    二,。g++4.4中C++11的标准库非常不完整。由于大多数标准库都是头文件,gnu的头文件通常都是ifdef版本,我认为可能有一种方法可以使用libstdc++中最新版本的头文件。我不能用不同的。不过,我想用它。我相信我可以把这两件事混在一起,但这样做对吗

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

    标题中没有完整的版本
    #ifdefs
    ,几乎你能找到的唯一的标题是检查
    \uuuuugxx\ucxx0x\uuuxx0x\uuxx>,这是G++在使用
    -std=c++0x
    时定义的,但这并不意味着你的4.4版本支持lambdas、非静态数据成员初始化器、正确的右值引用语义,默认/删除的函数等,以后的标题可以自由使用。必须将libstdc++头与附带的GCC版本一起使用

    简言之,如果您想要适当的C++11支持,您需要使用更新的编译器


    如果您不能使用更新的编译器,您就无法获得适当的C++11支持。

    关于第2个问题,您能否更新到更新版本的g++?据我所说,4.8似乎有更全面的支持,但不幸的是,我无法在这种环境下做到这一点。@Xymostech,4.8甚至还没有发布,可能在4-6个月内都不会发布。感谢您的解释。我想我现在必须等待新功能的推出。这在今天仍然是真的吗?或者换句话说:在什么情况下我可以将c++98/03库与c++11库(带有GCC)混合使用?@Andre我已经稍微更新了答案。我提供的wiki链接仍然有效。一般来说,在GCC 5+中,您可以混合使用任何
    -std
    选项编译的代码,有关该规则的例外情况,请参见wiki页面。