g++-std=c++0x及其兼容性

g++ -std=c++0x and compatibility

本文关键字:兼容性 c++0x g++-std      更新时间:2023-10-16

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

我有两个问题,很难找到确切的答案。

  1. 如果我用-std=c++0x或-std=g++0x编译一个共享库,我能保证使用我的库的程序不需要这些开关吗(前提是我在头文件中没有c++0x功能)?这似乎奏效了,但我不想因为以后的微妙问题而报名。

  2. g++4.4中C++11的标准库是相当不完整的。由于大部分标准库都只是头文件,而且gnu的头文件通常都是ifdef版本,所以我认为可能有一种方法可以使用libstdc++中至少头文件的最新版本。我不能用不同的。不过,就这样吧。我确信我可以把这些拼凑在一起,但有可能正确地做这样的事情吗?

谢谢。

1。如果我使用-std=c++0x或-std=g++0x编译共享库,我是否可以保证使用我的库的程序不需要这些开关(前提是我在头文件中没有c++0xs功能)?这似乎奏效了,但我不想因为以后的微妙问题而报名。

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++中至少头文件的最新版本。我不能用不同的。不过,就这样吧。我确信我可以把这些拼凑在一起,但有可能正确地做这样的事情吗?

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

头文件并没有充满版本#ifdefs,几乎你能找到的只有对__GXX_EXPERIMENTAL_CXX0X__的检查,当你使用-std=c++0x时,它是由G++定义的,但这并不意味着你的4.4版本支持lambdas、非静态数据成员初始值设定项、正确的右值引用语义、默认/删除函数等,这些都是后来的头文件可以自由使用的。必须将libstdc++标头与附带的GCC版本一起使用。

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

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

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

类似地,还有一个vector(count, item = T())构造函数,它在C++11中已经不存在了(现在是两个构造函数)。

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

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