`

G++和GCC的区别(转帖)

    博客分类:
  • C++
 
阅读更多

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的。
转自:http://blog.csdn.net/shaoxin_long/article/details/4831679
分享到:
评论

相关推荐

    gcc g++ gcc g++ gcc g++ gcc g++

    gcc g++ gcc g++ gcc g++ gcc g++ gcc g++

    g++和gcc离线安装包

    g++和gcc离线安装包。linux中安装redis需要的依赖。 安装方式: gcc-c++ ```bash # 将文件放到任意位置。我放到/home/soft下 cd /home/soft # 解压gcc-c++ tar -zxf gcc-c++.tar.gz #进入目录 cd /home/soft/gcc-c++...

    g++和gcc的相同点和区别共5页.pdf.zip

    当我们谈论C++编程时,两个常见的编译器是g++和gcc。尽管它们经常被提及在一起,但它们之间存在一些重要的相似性和差异性。以下是关于g++和gcc的详细分析。 **相同点:** 1. **开源与免费**:两者都是GNU Project...

    linux离线安装gcc ,g++,gcc-4.5.1

    在Linux环境中,GCC(GNU Compiler Collection)和G++是开发者常用的C和C++编译器。GCC不仅支持C和C++,还支持Fortran、Ada、Go等多种编程语言。G++是GCC的一部分,专门用于C++的编译。在某些没有网络连接的环境下,...

    gcc和g++的区别

    GCC(GNU Compiler Collection)和G++是GNU项目的一部分,它们都是用于编译源代码的工具。G++实际上是一个前端程序,专门用于处理C++源代码,而GCC则是一个更广泛的编译器集合,支持多种编程语言,包括C、C++、...

    linux下gcc,g++的用法和区别,以及makefile的编写

    ### Linux 下 GCC、G++ 的用法和区别,以及 Makefile 的编写 #### GCC 和 G++ 编译流程 在 Linux 系统中,GCC (GNU Compiler Collection) 是一个非常强大的工具集,它包含了多种编程语言的编译器,如 C、C++、...

    gcc g++ 离线安装包

    在IT行业中,GCC(GNU Compiler Collection)和G++是至关重要的工具,主要用于C和C++编程语言的编译。这两个工具是由GNU项目开发的,旨在提供一个自由且开源的编译系统,支持多种编程语言。在某些情况下,如在没有...

    g++ gcc编译器安装包及其依赖

    在Linux系统中,`g++` 和 `gcc` 是两个非常重要的工具,它们是GNU Compiler Collection(GNU编译器集合)的一部分,用于编译和构建C++和C语言的程序。`g++` 主要针对C++编程语言,而`gcc` 则是针对C语言的,但同时也...

    gcc、g++离线安装包

    在Linux环境中进行C++开发,GCC(GNU Compiler Collection)和G++是不可或缺的工具。GCC是一套由GNU项目维护的开源编译器集合,而G++是GCC的一部分,专门用于C++语言的编译。本离线安装包“gcc-centos7.2.zip”和...

    Android上的gcc/g++编译环境

    本主题将深入探讨如何在Android设备上建立和使用GCC(GNU Compiler Collection)和G++(GNU C++ Compiler)编译环境,以实现C和C++代码的编译和执行。这个压缩包提供了必要的工具和步骤来实现这一目标。 首先,`...

    nginx离线安装依赖g++,gcc,openssl等

    5. `gcc.zip` 和 `g++.zip`:这两个是GCC(GNU Compiler Collection)的编译器工具链,包括C编译器(gcc)和C++编译器(g++)。它们用于将源代码编译成可执行程序,是Linux环境下开发和安装软件的基础。 离线安装...

    gcc-g++4.8.5离线安装包.rar

    标题 "gcc-g++4.8.5离线安装包.rar" 涉及的是在Linux系统上安装GCC(GNU Compiler Collection)和G++(GNU C++编译器)的离线方法,具体版本为4.8.5。GCC是开源的、跨平台的编译器套件,它包括了C、C++、Fortran、...

    cqcppsdk-master_g++_gcc_cqcppsdk_cqcppsdk的使用_酷Q插件_

    使用g++和gcc这两个编译器,开发者可以编译和链接cqcppsdk库到他们的项目中。g++是GNU C++编译器,用于C++代码,而gcc则是通用的GNU编译系统,可用于C、C++等多种语言。选择这两个编译器,意味着该SDK兼容这两种语言...

    centos7 gcc/g++离线rpm包

    5. **验证安装**:安装完成后,可以通过运行`gcc --version`和`g++ --version`来验证GCC和G++是否已成功安装并查看其版本信息。 离线安装GCC/G++的这种方法对于那些在隔离网络环境中工作或者在多台服务器上部署相同...

    gcc g++ rpm 安装包

    编译C++程序要安装g++ gcc-c++-3.4.6-3.i386.rpm libstdc++-devel-3.4.6-8.i386.rpm libstdc++-3.4.6-8.i386.rpm install.sh的内容 rpm -Uvh glibc-kernheaders-2.4-9.1.103.EL.i386.rpm --nodeps --force ...

    gcc g++完整依赖rpm包

    在Linux操作系统中,GCC(GNU Compiler Collection)和G++是两个至关重要的编译器,用于将源代码编译成可执行程序。GCC主要处理C语言,而G++是其扩展,支持C++语言。RPM(Red Hat Package Manager)是Linux下的...

    linux离线安装gcc,g++,gcc-(生产环境常用)

    执行顺序 rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm rpm -ivh cpp-4.4.7-4.el6.x86_64.rpm ... 或 直接执行 install-gcc.sh

Global site tag (gtag.js) - Google Analytics