【问题标题】:Are all of the features of C99 also in C++?C99 的所有功能是否也在 C++ 中?
【发布时间】:2018-05-11 11:53:48
【问题描述】:

This page 列出了 C99 中的 53 个新特性(即它们在 C99 中但不在 C89 中)。所有这些功能是否也在 C++ 中?甚至是 C++98?

如果不是,哪些功能在 C++ 中,哪些不是?

【问题讨论】:

  • 您可能希望自己将功能添加到问题中,以防链接失效。
  • 我会说 C99 的大多数新核心语言特性都不是 C++。 VLA 不在 C++ 中。复合文字不在 C++ 中。灵活的数组成员不在 C++ 中。像 void foo(int a[const static 5]) 这样的语法不在 C++ 中。 restrict 不在 C++ 中。等等。这些语言的核心已经不可逆转地分道扬镳。从来没有打算让它们保持同步。
  • @MillieSmith -- 但don't-ask 建议问题应该是“合理的范围”。要求某人在答案中查看包含 53 个功能的列表似乎会让人相信“范围合理”。
  • 花了 15 分钟浏览它们。当然,可能会犯一些错误......但是一些 C++ 人可能会进行校对。
  • 几年后,随着 C++ 的发展,这个好问题将失去精确性。考虑将问题命名为 C++ 的特定版本。 (可能是 2017 年的最后两个。)

标签: c++ c c99 c89


【解决方案1】:

C++ (ISO 14882:2017) 完全支持以下 C99 (ISO 9899:1999) 功能:
(虽然库标题将是 <cname> 而不是 <name.h>

  • <wchar.h><wctype.h> 中的宽字符库支持(最初 ISO/IEC 9899:1990/Amd.1:1995 中规定)
  • <tgmath.h> 中的类型通用数学宏
  • long long int 类型和库函数
  • 扩展整数类型
  • 提高了最低翻译限制
  • <float.h> 中的其他浮点特性
  • 移除隐式int
  • 可靠的整数除法
  • 通用字符名称(\u 和 \U)
  • 扩展标识符
  • 十六进制浮点常量和 %a 和 %A printf/scanf 转换 说明符
  • // cmets
  • <inttypes.h><stdint.h>中指定宽度整数类型和对应的库函数
  • 移除隐式函数声明
  • 在 intmax_t/uintmax_t 中完成的预处理算术
  • 混合声明和声明
  • 选择和迭代语句的新块范围
  • 整数常量类型规则
  • 整数提升规则
  • <stdio.h><wchar.h> 中的 vscanf 系列函数
  • <math.h> 中的其他数学库函数
  • 数学库函数 (math_errhandling) 处理错误情况
  • <fenv.h>中的浮点环境访问
  • IEC 60559(也称为 IEC 559 或 IEEE 算术)支持
  • 枚举声明中允许使用尾随逗号
  • printf 中允许使用 %lf 转换说明符
  • 内联函数
  • <stdio.h> 中的 snprintf 系列函数
  • 幂等类型限定符
  • 空宏参数
  • 其他预定义宏名称
  • _Pragma 预处理运算符
  • 标准编译指示
  • __func__预定义标识符
  • va_copy 宏
  • 其他 strftime 转换说明符
  • LIA 兼容性附件
  • 弃用二进制文件开头的 ungetc
  • 删除别名数组参数的弃用
  • 数组到指针的转换不限于左值
  • 对聚合和联合初始化的宽松约束
  • 放宽对可移植标头名称的限制
  • 在返回值的函数中不允许在没有表达式的情况下返回(反之亦然) 反之)
  • 具有可变数量参数的宏

以下 C99 功能在 C++ 中的用途类似,但存在实现差异且语言代码不兼容:

  • 通过二合字母和<iso646.h> 限制字符集支持(最初指定 在 ISO/IEC 9899:1990/Amd.1:1995)
  • 通过有效类型更精确的别名规则
  • <complex.h> 中的复杂(和虚构)支持
  • <stdbool.h> 中的布尔类型
  • 新的结构类型兼容性规则(标签兼容性)

C++ 不支持以下 C99 功能:

  • 受限指针
  • 可变长度数组
  • 灵活的数组成员
  • 参数数组声明器中的静态和类型限定符
  • 复合字面量
  • 指定的初始化器

【讨论】:

  • 由于我几乎不是 C++ 大师,我几乎可以肯定已经搞砸了其中的几个。因此社区维基。如果您发现任何错误,请编辑并将其移至正确的类别!
  • 参数数量可变的宏,这不就是[variadic macros](参数数量可变的宏)吗?
  • @NathanOliver 是的。这些术语取自 C99 的前言。我只是从那里复制/粘贴了在 C99 中所做的所有更改。
  • 我认为@NathanOliver 指的是,从C++11 开始,C++ 支持可变参数宏。那么,“具有可变数量参数的宏”应该属于不同的类别吗?还是您的答案是针对旧版 C++98 的?
  • @Lundin 对不起,我搞砸了我的链接。由于支持 C++11 variadic macros
【解决方案2】:

Flexible array members 不是任何 C++ 标准的一部分(dynarray 提案是在 C++ 中改编的 not)。还有许多其他较少使用的 C99 特性是 C++ 中没有的。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多