繁体   English   中英

C++ 包括 C99 还是 C89?

[英]Does C++ include C99 or C89?

我即将学习C++。
C语言的语法有两种。 指针和数组。
它们是在 C 标准中定义的,有很多子条款。 我知道 C++ 是 C 的超集(它可能是一种概括)。 那么这些特性和C++一样吗? 如果是这样,什么版本的 C++ 有什么版本的 C?

C++ 包括 C99 还是 C89?

目前,虽然 C 和 C++ 的公共子集很重要,但 C++ 不包括它的全部内容。 缺少某些功能,并且语言之间存在不兼容的差异。 C++ 标准“兼容性/C++ 和 ISO C [diff.iso]”和“C 标准库 [diff.library]”的非规范部分列出了(部分)差异。

但是,C++“基于”C 标准并且确实引用了它。 以下是最新标准草案的引述:

[介绍范围]

C++ 是一种基于 C 编程语言的通用编程语言,如 ISO/IEC 9899:2018 编程语言 — C(以下简称 C 标准)中所述。 C++ 提供了许多超出 C 提供的工具......

[介绍.refs]

以下文件在正文中的引用,其部分或全部内容构成本文件的要求。 对于注明日期的参考文献,仅适用所引用的版本。 对于未注明日期的参考文献,适用参考文件的最新版本(包括任何修订)。

  • ...
  • ISO/IEC 9899:2018,编程语言 — C
  • ...

ISO/IEC 9899:2018 第 7 条中描述的库在下文中称为 C 标准库。


什么版本的 C++ 有什么版本的 C?

  • C++20 基于 C18
  • C++17 基于 C11
  • C++14 基于 C99
  • C++11 基于 C99
  • C++03 基于 C89/C90
  • C++98 基于 C89/C90

从历史的角度来看,(标准前的)C++ 在 C 被标准化之前就已经存在,因此最初不可能基于任何标准。 两种语言都是从这个共同的根源演变而来的,并朝着自己的方向发展。

另外,请注意,尽管许多 C 习语在 C++ 中工作,但它们在 C++ 中不是习语,被认为是一种不好的做法。 据我了解,高度兼容的原因(超出编写通用头文件的能力)是将 C 程序移植到 C++ 的简便性,允许它以小的增量步骤进行转换。 例如,从来没有理由在 C++ 中编写NULL ,也几乎没有理由编写malloc

Stroustrup 本人在其主页https://www.stroustrup.com/bs_faq.html#C-is-subset上解决了这个问题。 关键点(强调我的):

  • 大部分是:“除了上面显示的一些示例(并在 C++ 标准和 C++ 编程语言(第 3 版)的附录 B 中详细列出)之外, C++ 是 C 的超集。” 即使在 C 中(隐式指针转换,缺少函数原型),大多数不兼容性也是糟糕的风格。
  • 关于您关于哪个C版本是C++的祖先的问题:“请注意,上面段落中的“C”指的是Classic C和C89。C ++不是C99的后代; C++和C99是兄弟姐妹。C99引入了几本小说C/C++ 不兼容的机会。” 新的不兼容性主要是可变长度数组,这在 C++ 中大多是不必要的,因为 C++ 有向量(但是,我知道的所有 C++ 编译器都支持它们,因为它们已经为它们的 C 前端实现了它们,所以为什么不呢)。

C 和 C++足够不同,最好将它们视为完全独立的语言,而不是将它们视为另一个的超或子集。 有无数合法的 C 程序不是合法的 C++ 程序,还有无数合法的 C 程序也是合法的 C++ 程序,但行为不同或产生不同的结果。 虽然它们确实共享一个很大的语法和语义的公共子集,但它们之间存在足够的差异,如果相同的代码在编译为 C 与 C++ 时给您不同的结果,您应该永远不会感到惊讶

设计良好且编写良好的 C++ 程序在外观或行为上与设计良好且编写良好的 C 程序不同。

编辑

这是我如何绘制两者之间的关系:

+------------------------------+
|   Valid C++ Only             |
|                              | 
|      +-----------------------+-------+
|      | Valid C and C++ with  | Valid |
|      | identical behavior    | C     |
|      |                       | Only  |
|      |                       |       |
|      |                       |       |
|      +-----------------------+       |
|      | Valid C and C++ with  |       |
|      | different behavior    |       |
|      +-----------------------+-------+
|                              |
|                              |
+------------------------------+

这两种语言有一个非常大的公共子集,它们之间的行为方式相同。 有一个较小的公共子集,其行为有所不同。 相对较少的 C 也不是有效的 C++,但是如果您尝试从 C 移植到 C++ 或支持两者之间的相同代码,这足以引起问题。 同样,我认为将它们视为完全独立的语言会更好。 你不太可能以这种方式感到惊讶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM