gpt4 book ai didi

c++ - CC、gcc 和 g++ 之间的区别?

转载 作者:IT老高 更新时间:2023-10-28 12:03:21 25 4
gpt4 key购买 nike

3个编译器CC、gcc、g++编译时有什么区别
汇编方面的 C 和 C++ 代码
代码生成、可用库、语言特性等?

最佳答案

这个问题的答案是特定于平台的;例如,在 Linux 上发生的事情与在 Solaris 上发生的事情不同。

简单的部分(因为它不是特定于平台的)是 'gcc' 和 'g++' 的分离:

  • gcc 是来自 GCC(GNU 编译器集合)的 GNU C 编译器。
  • g++ 是来自 GCC 的 GNU C++ 编译器。

  • 困难的部分,因为它是特定于平台的,是'CC'(和'cc')的含义。
  • 在 Solaris 上,CC 通常是 Sun C++ 编译器的名称。
  • 在 Solaris 上,cc 通常是 Sun C 编译器的名称。
  • 在 Linux 上,如果存在,CC 可能是 g++ 的链接。
  • 在 Linux 上,cc 是 gcc 的链接。

  • 然而,即使在 Solaris 上,cc 也可能是来自 /usr/ucb 的旧的基于 BSD 的 C 编译器。 .在实践中,通常没有安装它,只有一个失败的 stub ,对那些试图编译和安装自配置软件的人造成严重破坏。

    在 HP-UX 上,默认的“cc”仍然是安装的仅支持 K&R 的 C 编译器,以允许在必要时重新链接内核,并且无法用于现代软件工作,因为它不支持标准 C。您必须使用其他编译器名称('acc' IIRC)。类似地,在 AIX 上,系统 C 编译器使用诸如“xlc”或“xlc32”之类的名称。

    传统上,默认系统编译器被称为“cc”,当自配置软件不知道还能使用什么时,它会使用该名称。

    POSIX 试图通过要求程序 c89(最初)和后来的 c99 存在来立法解决这个问题。这些是与 ISO/IEC 9899:1989 和 9899:1999 C 标准兼容的编译器。 POSIX 是否成功值得怀疑。

    该问题询问功能和库方面的差异。和以前一样,答案部分是特定于平台的,部分是通用的。

    C 编译器和 C++ 编译器之间存在很大的分歧。 C++ 编译器将接受 C++ 程序并且不会编译任意的 C 程序。 (尽管可以在 C++ 也能理解的子集中编写 C,但许多 C 程序不是有效的 C++ 程序)。类似地,C 编译器将接受 C 程序并拒绝大多数 C++ 程序(因为大多数 C++ 程序使用 C 中不可用的构造)。

    可供使用的库集取决于语言。 C++ 程序通常可以在给定平台上使用 C 库; C 程序通常不能使用 C++ 库。因此,C++ 有更多可用的库。

    请注意,如果您在 Solaris 上,则 CC 生成的目标代码与 g++ 生成的目标代码不兼容——它们是两个独立的编译器,对于异常处理和名称修改等事情有不同的约定(并且名称修改是故意的以确保不兼容的目标文件不会链接在一起!)。这意味着如果你想使用一个用 CC 编译的库,你必须用 CC 编译你的整个程序。这也意味着,如果你想使用一个用 CC 编译的库和另一个用 g++ 编译的库,那你就不走运了。您必须至少重新编译其中一个库。

    在生成的汇编器质量方面,GCC(GNU Compiler Collection)做得非常好。但有时 native 编译器工作得更好一些。我相信,英特尔编译器具有更广泛的优化,这些优化尚未在 GCC 中复制。但是,任何此类夸夸其谈都是危险的,而我们不知道您关注的是哪个平台。

    在语言特性方面,编译器一般都比较接近当前的标准(C++98、C++2003、C99),但标准语言和编译器支持的语言之间通常存在细微差别。对于所有 C 编译器,旧的 C89 标准支持基本上是相同的(并且是完整的)。语言的阴暗角落存在差异。您需要了解“未定义行为”、“系统定义行为”和“未指定行为”;如果您调用未定义的行为,您将在不同的时间得到不同的结果。还有很多选项(尤其是 GCC)来调整编译器的行为。如果您知道自己只针对该编译器系列,则 GCC 具有多种扩展功能,可以让您的工作变得更简单。

    关于c++ - CC、gcc 和 g++ 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1516609/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com