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
不会。