在编译时,CC、gcc和g++三种编译器之间有什么区别

推荐答案

答案是特定于平台的;例如,Linux上的情况与Solaris上的情况不同.

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

  • GCC是GCC(GNU编译器集)的GNUC编译器.
  • 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编译器.在实践中,这通常不会安装,只有一个存根失败了,这对那些试图编译和安装自配置软件的人造成了严重 destruct .

在HP-UX上,默认的"cc"仍然是K&;安装R-only C编译器以允许在必要时重新链接内核,并且不能用于现代软件工作,因为它不支持标准C.您必须使用其他编译器名称("acc"IIRC).类似地,在AIX上,system C编译器的名称是"xlc"或"xlc32".

传统上,默认的系统编译器被称为"cc",而自配置软件在不知道还可以使用什么时会使用这个名称.

POSIX试图通过立法来绕过这一问题,要求存在程序c89(最初)和更高版本的c99;这些编译器与ISO/IEC9899:1989和9899:1999C标准兼容.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编译器集合)做得非常好.但有时本地编译器的工作效果会更好一些.英特尔编译器有更广泛的优化,我相信这在GCC中还没有被复制.但是,任何这样的教旨主义都是危险的,而我们不知道你们关心的是什么平台.

就语言特性而言,编译器通常都非常接近当前的标准(C++98、C++2003、C99),但标准语言和编译器支持的语言之间通常存在微小差异.旧的C89标准对所有C编译器的支持基本上是相同的(并且是完整的).在语言的黑暗角落中存在差异.你需要理解"未定义的行为"、"系统定义的行为"和"未指定的行为";如果调用未定义的行为,在不同的时间会得到不同的结果.还有许多选项(尤其是GCC)可以调整编译器的行为.GCC有各种各样的扩展,如果你知道你只针对这个编译器系列,那么它会让你的生活变得更简单.

C++相关问答推荐

char为16位且Short也为16位的c环境合法吗

有什么方法可以检测SunOS上的SparcWorks吗?

strftime函数中%s的历史意义是什么?为什么没有记录?

常数函数指针优化

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

我无法让LLDB正确运行我的可执行文件

GCC创建应用于移动项的单独位掩码的目的是什么?

如何使用C++在控制台中以彩色打印被阻止的客户端

为 struct 中的数组动态分配内存时出错

试图创建一个基本的Word克隆,但遇到了障碍

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

我正在try 将QSORT算法实现为C++中的泛型函数

挥发性语义的形式化理解

memcmp 是否保证按顺序比较字节?

malloc 属性不带参数

C simd _m128 晶圆厂

C 中类型说明符的顺序重要吗?