加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

g -std = c 0x和兼容性

发布时间:2020-12-16 03:45:31 所属栏目:百科 来源:网络整理
导读:我正在使用g 4.4在 linux上编译共享库.如果我可以在库中,我想使用一些C 11功能,但我无法更新编译器的版本或我的库的用户需要任何特殊的编译器开关. 我有两个问题,我很难找到明确的答案. 如果我使用-std = c 0x或-std = g 0x编译共享库,我保证使用我的库的程
我正在使用g 4.4在 linux上编译共享库.如果我可以在库中,我想使用一些C 11功能,但我无法更新编译器的版本或我的库的用户需要任何特殊的编译器开关.

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

>如果我使用-std = c 0x或-std = g 0x编译共享库,我保证使用我的库的程序不需要那些开关(前提是我在头文件中没有c 0x功能)?它似乎有效,但我不想在未来注册微妙的问题.
> C 4.4中的标准库g 4.4非常不完整.由于标准库的大部分都是标题库而且gnu的头文件通常都是版本ifdef,我认为可能有一种方法可以使用libstdc中至少头文件的更新版本.不过,我不能使用不同的.so.我相信我可以将它们整合在一起,但有可能正确地做这样的事情吗?

谢谢.

解决方法

1. If I compile a shared library with -std=c++0x or -std=g++0x,am I guaranteed that a program that uses my library doesn’t need those switches (provided I have no c++0x features in the header files)? It seems to work,but I don’t want to be signing up for subtle problems down the road.

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

2. The standard library for C++11 in g++ 4.4 is quite incomplete. Since much of the standard library is header-only and gnu’s header files are generally full of version ifdefs,I would think that there may be a way to use a more recent version of at least the header files in libstdc++. I can’t use a different .so for it,though. I’m sure I can kludge this together,but is it possible to do something like this correctly?

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

标题中没有#ifdefs版本,几乎唯一可以找到的是__GXX_EXPERIMENTAL_CXX0X__的检查,当你使用-std = c 0x时,这是由G定义但这并不意味着你的4.4版本支持lambdas,非静态数据成员初始值设定项,正确的右值引用语义,默认/删除的函数等,后面的标题可以自由使用.您必须使用libstdc标头与它们附带的相同版本的GCC.

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

如果您不能使用较新的编译器,则无法获得适当的C 11支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读