【C++11新特性】| 【07】兼容性大汇总

本文详细对比了C++11与C++03之间的不兼容性,包括新增关键字、类型推导、异常处理等方面的变化,并探讨了C++与ISO C在关键字、类型定义、内存管理等方面的差异。此外,还介绍了C++11中被弃用的特性,如auto的新含义、export的移除等。同时,提到了gcc的特定编译选项以支持C++11特性。
摘要由CSDN通过智能技术生成

1、C++11与C++03的不兼容

1、C++11支持自定义的字面常量;

3、C++11引入了一些新的关键字:alignas、alignof、char16_t、char32_t、constexpr、decltype.noexcept、nullptr.static_ assert和 thread_local;

4、C++11引人了C99的新类型long long;

5、C++11和C99一样,对整数向“0”取商(/)或取余(%);而C++03允许向负无穷取商或取余;

6、auto由初始化表达式推导而来;

7、C++11要求数组初始化时,不能将数据的类型收窄;

8、可能导致问题的隐式函数在C++11被定义为deleted。这些隐式函数不能被使用;

9、 C++11中去除了无用的关键字:export;

10、C++11中,模板嵌套时可以直接使用双右尖括号,C++03则需要空白字符填充尖括号;

11、C++11中,swap方法从<algorithm>移到了<utility>中;

12、C++11加人了一个新的顶级namespace: posix;

13、通用属性中的标记符如carries_dependency、noreturn不能作为宏名;

14、C++03假设全局的new操作符只会抛出类型为std:;bad_alloc的异常﹔C++11允许全局的new操作符抛出其他类型的异常;

15、C++11要求errno变量是线程局部的,而不是全局的;

16、C++11支持轻量级的垃圾回收机制;

17、标准库中的仿函数(函数对象)不再继承自std::unary_function和 std:.binary_function;

18、标准容器要提供的size()成员函数要求是O(0)复杂度;C++03中std:list的成员size()允许线性复杂度;

19、C++11中改变了一些函数方法的原型,比如erase和insert的返回值类型iterator变成了const_iterator,resize 函数的参数从传值改为了传引用;

20、C++11允许一些类和函数方法的实现不同于C++03,比如:std::remove、std:remove_if、 std::complex、std::ios_base::failure;

2、C++与ISO C不兼容的项目

1、C++中很多关键字是C所没有的;

2、C中字符常量的类型是int,C++中是char;

3、C++中字符串常量的类型是const char[],而C中字符串常量的类型是char[];

4、C中允许文件范围中的变量重复定义;而这在C++中是不允许的;

5、不带extern关键字的const变量在C++中是(内部链接的,即不可以被其他文件中同名变量引用);而在C中则是(外部链接的,即可以被其他文件中的同名变量引用);

6、C++要求从void*类型变量到其他类型的转化必须是显式的;而C中则不需要显式转换;

7、C++中只有非常量非易变对象( non-const ,non-volatile)指针可以转换为void*类型;

8、C++不接受隐式声明函数。这个特性在ISOC中也逐渐被抛弃;

9、不能在结构体或类型的声明上加static关键字,在C中static关键字将被忽略;C++中这则是错误的语法;

10、C++中typedef的类型别名不能和已有的类型同名;

11、常量( const)对象在C++中必须初始化;在C中则没这个限制;

12、隐式 int类型在C++中被禁止,C中也逐渐抛弃;

13、关键字auto在C++11中有新的语义:用于类型自动推导;而C中auto是修饰对象的存储类型的关键字。

14、C++中enum对象只能用同类型的enum赋值;C中可以用任意的整型数对enum变量赋值。C++中enum变量的类型是对应的enum类型;而C中enum对象的类型是int整型;

15、函数声明中的空参数在C+中意味着函数没有参数;而在C中则意味着该函数的参数个数未知;

16、C+不允许类型定义在函数的参数或返回值类型的位置上;

17、C++不接受老的废弃的函数定义格式:参数在()之外;

18、作用域内部的结构体在C++中会覆盖作用域外部的同名变量;

19、C++中,嵌套的结构体仅在其父结构体作用域中可见;而在C则全局可见;

20、C++中typedef形成的类型别名不能重定义为其他类型或变量;

21、C++中volatile的对象不能作为隐式构造函数和隐式赋值函数的参数;

3、C++11弃用特性

1、auto关键字被改动为自动推导;

2、export特性被移除,关键字保留;

3、register:声明将变量存放在寄存器中(改为)==> 改变为声明存储类的关键字;

4、隐式拷贝函数:
	若类中已声明其他拷贝或者析构函数,编译器仍会自动生成一个隐式拷贝
	==> 改动:隐式拷贝函数不会自动生成;

5、auto_ptr:智能指针,当系统因异常退出时避免资源泄漏(改为)==> unique_ptr所取代;

6、bind1st/bind2nd:将二元函数对象绑定成一元仿函数(函数对象)(改为)==> bind;

7、函数适配器:ptr_fun, mem_fun, mem_fun_ref, unary_function, binary_function弃用。

8、异常:throw()被noexcept取代。

4、gcc编译选项

-fabi-version=6:					增强abi对C++11中限定范围的enum类型提升的支持
-fconstexpr-depth=n:				设置C++11常量表达式的计算层数
-Wnarrowing:						按C++11要求,对数据截断提供诊断信息
-Wc++11-compat:					对C++11与C++98有区别的地方报错
-Wzero-as-null-pointer-constant:	当数字О作为空指针使用时报错,C++11中空指针是nullptr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值