gcc和g++有什么区别?

来源 | C语言中文网

发展至今,GCC 编译器已经更新至 V10 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。

除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本教程主要讲解如何使用 GCC 编译器编译运行 C 和 C++ 程序,因此有关其它编程语言如何使用 GCC 编译器编译,将不再做具体讲解。

那么,在已编辑好 C 语言或者 C++ 代码的前提下,如何才能调用 GCC 编译器为我们编译程序呢?很简单,GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器。

值得一提的是,实际使用中我们更习惯使用 gcc 指令编译 C 语言程序,用 g++ 指令编译 C++ 代码。需要强调的一点是,这并不是 gcc 和 g++ 的区别,gcc 指令也可以用来编译 C++ 程序,同样 g++ 指令也可以用于编译 C 语言程序。

那么,gcc 和 g++ 的区别是什么呢?

实际上,只要是 GCC 支持编译的程序代码,都可以使用 gcc 命令完成编译。可以这样理解,gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别,比如:

  • xxx.c:默认以编译 C 语言程序的方式编译此文件;

  • xxx.cpp:默认以编译 C++ 程序的方式编译此文件。

  • xxx.m:默认以编译 Objective-C 程序的方式编译此文件;

  • xxx.go:默认以编译 Go 语言程序的方式编译此文件;

当然,gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项。例如,gcc -xc xxx 表示以编译 C 语言代码的方式编译 xxx 文件;而 gcc -xc++ xxx 则表示以编译 C++ 代码的方式编译 xxx 文件。有关 -x 选项的用法,后续会给出具体样例。

但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译。

有读者可能会认为,C++ 兼容 C 语言,因此对于 C 语言程序来说,使用 gcc 编译还是使用 g++ 编译,应该没有什么区别,事实并非如此。严格来说,C++ 标准和 C 语言标准的语法要求是有区别的。举个例子:

//位于 demo.c 文件中
#include <stdio.h>
int main()
{const char * a = "abc";printStr(a);return;
}
int printStr(const char* str)
{printf(str);
}

如上所示,这是一段不规范的 C 语言代码。如果我们使用 gcc 指令编译,如下所示:

[root@bogon ~]# gcc -xc demo.c   #或者直接运行 gcc demo.c
[root@bogon ~]#

可以看到,该指令的执行过程并没有发生任何错误。而同样的程序,如果我们使用 g++ 指令编译:

[root@bogon ~]# g++ demo.c
demo.c: In function ‘int main()’:
demo.c:5: error: ‘printStr’ was not declared in this scope
demo.c:6: error: return-statement with no value, in function returning ‘int’
[root@bogon ~]# 

可以看到,GCC 编译器发现了 3 处错误。显然,C++ 标准对代码书写规范的要求更加严格。

除此之外对于编译执行 C++ 程序,使用 gcc 和 g++ 也是有区别的。要知道,很多 C++ 程序都会调用某些标准库中现有的函数或者类对象,而单纯的 gcc 命令是无法自动链接这些标准库文件的。举个例子:

//demo.cpp
#include <iostream>
#include <string>
using namespace std;
int main(){string str ="C语言中文网";cout << str << endl;return 0;
}

这是一段很简单的 C++ 程序,其通过 <string> 头文件提供的 string 字符串类定义了一个字符串对象,随后使用 cout 输出流对象将其输出。对于这段 C++ 代码,如果我们使用 g++ 指令编译,如下所示:

[root@bogon ~]# g++ demo.cpp
[root@bogon ~]#

可以看到,整个编译过程没有报任何错误。但如果使用 gcc 指令:

[root@bogon ~]# gcc demo.cpp
/tmp/ccIOnwra.o: In function `main':
demo.cpp:(.text+0x13): undefined reference to `std::allocator<char>::allocator()'
#省略了诸多错误信息

读者可自行编译,就可以看到很多报错信息。其根本原因就在于,该程序中使用了标准库 <iostream> 和<string> 提供的类对象,而 gcc 默认是无法找到它们的。

如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加 -lstdc++ -shared-libgcc 选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C++ 标准库。也就是说,我们可以这样编译 demo.cpp 文件:

[root@bogon ~]# gcc -xc++ demo.cpp -lstdc++ -shared-libgcc
[root@bogon ~]#

由此,demo.cpp 就被成功的编译了。

读者可以这样认为,g++ 指令就等同于gcc -xc++ -lstdc++ -shared-libgcc指令。显然后者书写是非常麻烦的,大多数人会更喜欢前者。

对于 gcc 和 g++ 指令,还有其它更多细节方面的区别,这里不再做更多的赘述。读完本节,读者只需要知道,对于 C 语言程序的编译,我们应该使用 gcc 指令,而编译 C++ 程序则推荐使用 g++ 指令,这就足够了。

免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

druid删除数据_Apache druid 删除数据流程 0.13

背景由于前端时间数据导入出现问题&#xff0c;导致druid 中的数据需要重新导入&#xff0c;但又要防止数据重复,需要把数据彻底清理。问题由于druid 属于时间序列数据库&#xff0c;删除的时候只能时间范围删除。删除流程根据时间范围查询segements 标识(在coordinator节点查询…

使用C语言扩展Python(四)

上一篇里的LAME项目已经展示了python如何与C语言交互&#xff0c;但程序仍不够理想&#xff0c;在python这一端仅仅是传递源文件和目标文件的路径&#xff0c;再调用C模块的encode方法来进行编码&#xff0c;但问题在于你无法控制encode函数&#xff0c;比如你想编码的源文件如…

案例 github_2019年12月Github上最热门的Java开源项目,速来围观!

转眼之间&#xff0c;已经进入了2020年&#xff0c;2019年发生的一切仿佛就在昨天。那么&#xff0c;刚过去不久的12月份GitHub上最热门的Java开源项目排行已经出炉啦。下面我带大家一起来看看上榜详情&#xff1a;1、Alinkhttps://github.com/alibaba/Alink Star 1695Alink 是…

实战CRC校验 | 固件如何校验自身完整性?

来源&#xff1a;公众号【鱼鹰谈单片机】作者&#xff1a;鱼鹰Osprey在一些比较严格的行业里面&#xff0c;不是说你的程序能完成必要功能就可以&#xff0c;还需要添加一些额外的功能&#xff0c;比如最常见的看门狗功能&#xff0c;它可以在程序死机时完成重启&#xff0c;但…

想一个颠覆性技术方向建议,你能想到什么?

如上图&#xff0c;是这次文章的主题。我对这个问题是有想法的&#xff0c;我现在是做音频研究&#xff0c;但是我觉得未来核心的方向一定是能源。试想一下&#xff0c;现在的手机功能越来越多&#xff0c;移动设备将会占领我们未来很长一段时间&#xff0c;那么手机的电池要如…

centos 安装idea 非可视化_太厉害了!目前 Redis 可视化工具最全的横向评测

转自&#xff1a;一入码坑深似海链接&#xff1a;www.jianshu.com/p/cb9f4dcb3b921. 命令行不知道大家在日常操作redis时用什么可视化工具呢&#xff1f;以前总觉得没有什么太好的可视化工具&#xff0c;于是问了一个业内朋友。对方回&#xff1a;你还用可视化工具&#xff1f;…

解决克隆clone github 仓库速度过慢的问题

解决克隆clone GitHub 仓库速度过慢的问题 由于大家都懂的原因&#xff0c;我们访问GitHub的速度确实有点慢&#xff0c;特别是克隆比较大的仓库的时候&#xff0c;那速度简直无法直视。 今天我就给大家带来一个邪门歪道&#xff0c;不通过FQ来解决速度问题。 先说结论吧&#…

聊聊身边的嵌入式,自拍神器自拍杆

曾几何时&#xff0c;自拍杆风靡世界&#xff0c;火当然是有原因的&#xff0c;这么一个小装备&#xff0c;极大的满足了人们爱拍照的需求&#xff0c;方便好用、经济实惠。恰巧我手上也有一个&#xff0c;收起来时很小、不占地方打开后可随意调节拍照同时它有个隐藏式三脚架功…

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(十二)多语言支持...

虽然平时很少接触老外的项目、也很少碰到老外&#xff0c;但往往赚大钱的人是经常跟老外做买卖的人居多&#xff0c;他们大多需要网站是全英文的&#xff0c;我们往往上手有一个成熟的中文的网站或者软件&#xff0c;例如成熟的B2C网上购物系统&#xff0c;但是没办法也没精力再…

lisp用entmake生产圆柱体_德BBG公司开发用于CFRP储罐模块生产过程的自闭合HPRTM模具...

自主概念、足以批量生产、可以降低投资成本。每次操作最多可同时生产15个气瓶。照片来源&#xff1a;BBG机械制造商BBG GmbH&Co.KG(德国明德尔海姆)于9月16日提出了一种自动闭合高压树脂传递模塑(HP-RTM)模具的概念&#xff0c;该模具能够快速、重复地制造各种车辆用的紧凑…

【深度剖析】小米CyberDog四足机器人的AI运动系统的实现

2021年8月10日&#xff0c;雷军进行继宣布造车之后的第二次演讲。在这场以“我的梦想&#xff0c;我的选择”为主题的演讲上&#xff0c;雷军详细讲述了创业后的故事&#xff0c;发布了一系列全新产品。其中&#xff0c;给人最大惊喜同时也给人带来诸多疑问的就是我们这篇推文的…

变更控制管理流程图_制度是最好的老板,流程就是最好的管理!流程建立法则(附案例)...

为什么很多企业制定了战略&#xff0c;一线执行却没有到位&#xff1f;为什么员工办事拖拉&#xff0c;执行力不到位&#xff1f;为什么总有下属在等待老板分配任务&#xff0c;不能主动地去工作&#xff1f;为什么一些企业的老板处于很忙碌的的糟糕状态&#xff1f;上述这样问…

第二节:Css重写样式

一丶 进入浏览器---->F12----->找到要修改的区域的Style 进行重写Css样式 二丶打开新页面 window.open("/Persitent/OtherIndex?connectionId" connectionId,"_blank"); 转载于:https://www.cnblogs.com/chenze-Index/p/9309775.html

我的Linux内核学习笔记

在开始今天的内容之前&#xff0c;其实有一些题外话可以和大家分享一下。自从工作以来&#xff0c;我个人一直都有一个观点。那就是怎么样利用简单的代码来说明开发中的问题&#xff0c;或者是解释软件中的原理&#xff0c;这是一个很高的学问。有些道理看上去云里雾里说不清楚…

10 文件无效_新手必看!10个CAD常见问题解决技巧

对于很多刚接触CAD的萌新来说&#xff0c;学习过程遇到的问题总是很多。如果没有老师解答的话&#xff0c;上百度搜索也常常不得要领&#xff0c;所以今天为大家做了大概的问题总结&#xff0c;主要是以下几个问题&#xff1a;1多线段合并A&#xff0e;输入命令“PE”B&#xf…

TurboMail手机客户端—强大的附件文档阅读能力

2019独角兽企业重金招聘Python工程师标准>>> 对于频繁使用邮件的用户而言&#xff0c;收发附件已是家常便饭&#xff0c;但对于手机查看附件&#xff0c;用户却遇到了很多问题。稍微低端的手机&#xff0c;除了txt格式的文本&#xff0c;基本上其他格式的文档&#…

连不上机器判断机器状态_如何准确估计机器人的状态,增强机器人控制的精度及稳定性...

在机器人学中&#xff0c;状态估计和控制一样&#xff0c;是无法避开的问题。 任何传感器的精度都是有限的&#xff0c;如何利用传感器信息&#xff0c;尽可能准确地估计一组完整描述机器人随时间运动的物理量&#xff0c;如位置、速度、加速度、角度、角速度等&#xff0c;是状…

2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法

Swift快速入门&#xff08;一&#xff09;之 Swift基础语法近期重新学习了一遍Swift语言&#xff0c;主要以《Swift编程权威指南&#xff08;第2版&#xff09;》为教程&#xff0c;学习过程中结合比对Java语言特性将学习心得作为三篇笔记&#xff1a;Swift基础语法&#xff0c…

bootstrap switch只出现一个对号_python:34.第一个只出现一次的字符位置

题目描述在一个字符串(0<字符串长度<10000&#xff0c;全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1&#xff08;需要区分大小写&#xff09;.解析暴力解法&#xff0c;时间复杂度是 。# -*- coding:utf-8 -*- class Solution:def Fi…

mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决

前不久&#xff0c;MacOS推送正式版Big Sur&#xff0c;我满怀期待的更新。更新的过程很平缓&#xff0c;一切都很顺利。但在使用时&#xff0c;出现了一个问题&#xff0c;系统偏好设置的锁无法解除&#xff0c;导致有些软件需要权限&#xff0c;却不能正常允许通过&#xff0…