CC,gcc和g ++之间的区别?

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

对此的答案是平台特定的; 例如,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编译器。 实际上,这通常不会被安装,只有一个存根失败,对试图编译和安装自configuration软件的人员造成严重破坏。

在HP-UX上,默认的'cc'仍然是安装了K&R的C编译器,以便在必要时允许内核重新连接,并且由于不支持标准C,因此不适用于现代软件工作。您必须使用替代编译器名称('acc'IIRC)。 与此类似,在AIX上,系统C编译器会使用“xlc”或“xlc32”等名称。

传统上,默认的系统编译器被称为“cc”,而自configuration软件在不知道还有什么其他用途的时候会回退到这个名字上。

POSIX试图通过要求c89(最初)和后来的c99存在的方式立法解决这个问题; 这些是符合ISO / IEC 9899:1989和9899:1999 C标准的编译器。 POSIX值得怀疑。


这个问题是关于function和库的差异。 和以前一样,答案部分是平台特定的,部分是通用的。

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

可供使用的一组库取决于语言。 C ++程序通常可以在给定的平台上使用C库; C程序通常不能使用C ++库。 所以,C ++有一大堆可用的库。

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

在汇编程序生成的质量方面,GCC(GNU编译器集合)做得非常好。 但有时候,本地编译器工作得更好一些。 我相信英特尔编译器有更广泛的优化,但尚未在海湾合作委员会复制。 但是任何这样的认识都是有害的,而我们不知道你关心的是什么平台。

就语言特性而言,编译器通常与当前标准(C ++ 98,C ++ 2003,C99)相当接近,但是标准语言和编译器所支持的语言之间通常存在很小的差异。 对于所有的C编译器来说,较老的C89标准支持本质上是相同的(并且是完整的)。 语言的黑暗angular落有所不同。 您需要了解“未定义的行为”,“系统定义的行为”和“未指定的行为”。 如果你调用未定义的行为,你将在不同的时间得到不同的结果。 还有很多选项(特别是GCC)来调整编译器的行为。 海湾合作委员会有各种各样的扩展,使生活更简单,如果你知道你只是针对编译器家族。

CC是引用系统的C编译器的环境variables。 它指向什么(图书馆可访问等)取决于平台。 通常它会指向/usr/bin/cc ,即实际的c编译器(驱动程序)。 在Linux平台上, CC几乎总是指向/usr/bin/gcc

gcc是GNU编译器集合的驱动程序二进制文件。 它可以编译C,C ++和其他可能的语言; 它通过文件扩展名来确定语言。

g++是像gcc这样的驱动程序二进制文件,但是为编译C ++而设置了一些特殊的选项。 值得注意的是(根据我的经验), g++默认链接libstdc ++,而gcc不会。