gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
 
误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
 
误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

gcc和g++的区别

我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。
 
误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
   if(argv == 0) return;
   printString(argv);
   return;
}
int printString(char* string) {
  sprintf(string, "This is a test.\n");
}
如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
 
误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
 
误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
 
误区四:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:
me.h:
extern "C" void CppPrintf(void);
 
me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
     cout << "Hello\n";
}
 
test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"       
int main(void)
{
    CppPrintf();
    return 0;
}
 
1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
完全相同!
              
2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同

[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   _Z9CppPrintfv, @function
完全相同!
【结论】完全相同,可见extern "C"与采用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g++是调用gcc的。

转载于:https://my.oschina.net/alphajay/blog/3989

gcc和g++的区别 (很详细的描述)相关推荐

  1. gcc和g++的区别[zz]

    很多人不是很明白GCC与G++的区别 gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作 ...

  2. gcc和g++的区别

    gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后 ...

  3. Linux的gcc和g++的区别

    Windows中我们常用vs来编译编写好的C和C++代码:vs把编辑器,编译器和调试器等工具都集成在这一款工具中,在Linux下我们能用什么工具来编译所编写好的代码呢,其实Linux下这样的工具有很多 ...

  4. 【Linux】gcc和g++的区别

    gcc和g++编译器的区别 gcc 现在是 gnu 提供的一些编译器工具的集合(Gnu Compiler Collection),以前是gnu 组织提供的 c 编译器(Gnu C Compiler). ...

  5. Linux下GCC与G++的区别和联系

    原文链接:https://www.linuxidc.com/Linux/2008-03/11943.htm GCC and g++分别是gnu的c & c++编译器 GCC/g++在执行编译工 ...

  6. cc、gcc、g++ 的区别和联系

    2018-02-24 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com cc 是 Unix 系统的 C Compiler,在 linux 下一般连接到 gcc . gcc 的全称 ...

  7. 静态路由和默认路由的配置实战及其区别--很详细哦

    静态路由和默认路由的配置实战及其区别   一:实验拓扑 二:实验要求 1:实现全网互通 2:实现静态路由与动态路由的区别认识 3:熟练掌握其配置命令 三:实验步骤 第一步:ip地址.环回扣的划分 R1 ...

  8. gcc和g++是什么,有什么区别?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 机器算法学习那些事 目前(2020-09)GCC 编译器已经更新至 ...

  9. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  10. gcc和g++有什么区别?

    来源 | C语言中文网 发展至今,GCC 编译器已经更新至 V10 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ . 除此之外,当下的 GCC 编译器还支持编 ...

最新文章

  1. opencv怎么2个摄像头_最后2个月,怎么做能够快速提分?
  2. python unitest框架_python单元测试框架Unitest
  3. 我们并非生活在“虚幻世界”宇宙或是三维空间
  4. mysql 中某个字段相同的数据拼接起来
  5. python如何表示坐标_python – 如何制作x坐标字母?
  6. android listview动态添加viewpager,向 ViewPager 中添加 包含 ListView 的 Fragment
  7. JAVA实现邮件发送
  8. 太阳跟踪 matlab,太阳能和最大功率点跟踪
  9. PGP加密软件介绍、下载地址(官方发行最新版)及安装教程
  10. 网友刷屏:秃了秃了!黑马Java项目教程上新
  11. 计算机中我的云文档在哪儿里,wps云文档可以删除吗在哪里删除
  12. 当下推荐系统的分析和关于长尾效应的解决猜想
  13. 2016.7.14 noip2014模拟题 LGTB的日常~(自己乱安的名字hhh
  14. 专访 | Apache Pulsar PMC 成员翟佳:社区的信任最重要
  15. html5 video首次观看禁止快进,Video Speed Controller - 快进/后退/回看在线视频
  16. IRQ和FIQ中断的区别
  17. linux学习笔记:四、Linux系统目录结构简述,一级目录
  18. 关于comparator升序、降序
  19. 爬取6.6w+豆瓣电影之后,分析他们的故事
  20. woo语言一行代码批量修改文件名称

热门文章

  1. SQL Server 本机 Web 服务的使用方案(转载)
  2. React Router 全部
  3. 哈希表:如何利用好高效率查找的“利器”?
  4. android 按键上报流程,input子系统详解,按键如何上报
  5. 几款ReactJS最优秀的UI框架
  6. .net core 定时任务
  7. android文字多行滚动显示,Android实现在TextView文字过长时省略部分或滚动显示的方法...
  8. PHP对银行卡号的几种常见操作
  9. 获取网页html内容
  10. PHP比较两个时间戳相差天时分秒