C 11 中引入的重大更改
C 11 引入了几项重大更改,这些更改可能导致以前有效的代码在编译期间失败。一个显着的变化是在标准库中引入了显式运算符 bool(),替换了运算符 void*() 的实例。虽然此更改主要影响依赖隐式转换的无效代码,但它仍然构成重大更改。
核心语言更改
- 关键字alignas、alignof、char16_t 、 char32_t、constexpr、decltype、noexcept、nullptr、static_assert 和 thread_local 是引入了。
- 大于 long 的整数文字现在可以被视为有符号 long long,而不是无符号整数。
- 除法现在总是向 0 舍入,与 C 2003 不同,C 2003 可能向负无穷舍入在某些情况下。
- auto 关键字不能再用作存储类说明符,因为它是为新的存储类保留的功能。
- 缩小转换范围会导致不兼容。例如,将 double 分配给 int 现在是无效的。
- 当显式定义格式不正确时,隐式特殊成员函数将被定义为已删除,从而导致以前有效的代码出现错误。
- 用户声明的析构函数有隐式异常规范(noexcept(true)),它可以在catch块中触发不同的行为。
- export关键字不再是在 C 11 中有效。
- 运算符>>现在可用于关闭两个模板,可能会影响使用序列 >> 的代码作为移位运算符。
- 现在允许具有内部链接的函数的依赖调用。
库更改
- 标准库C 11 中引入的标识符可能与用户定义的标识符冲突。
- 标头包含引用 C 11 标准库中的新头文件可能无法编译。
- 交换函数已从 移至到 。
- posix 全局命名空间现已保留。
- 宏 override、final、carrys_dependency 和 noreturn 不再有效。
以上是C 11 引入了哪些重大变化?的详细内容。更多信息请关注PHP中文网其他相关文章!