我们在编译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的。
相关推荐
Ubuntu/Linux 下安装 GCC 和 G++ C++ 开发环境 在 Ubuntu/Linux 操作系统中,安装 GCC 和 G++ 是编译和运行 C++ 程序的必要步骤。GCC(GNU Compiler Collection)是一款开源的编译器套件,能够编译多种语言,包括 C...
适合无网环境安装GCC与G++,版本为:4.8.5. 压缩包内置安装脚本:install.sh。运行即可完成安装。 方便快捷有效,可以避免各类依赖的困扰。 ---- 适合无网环境安装GCC与G++,版本为:4.8.5. 压缩包内置安装脚本:...
在IT行业中,GCC(GNU Compiler Collection)和G++是至关重要的工具,主要用于C和C++编程语言的编译。这两个工具是由GNU项目开发的,旨在提供一个自由且开源的编译系统,支持多种编程语言。在某些情况下,如在没有...
在Linux环境中,GCC(GNU Compiler Collection)和G++是开发者常用的C和C++编译器。GCC不仅支持C和C++,还支持Fortran、Ada、Go等多种编程语言。G++是GCC的一部分,专门用于C++的编译。在某些没有网络连接的环境下,...
5. **验证安装**:安装完成后,可以通过运行`gcc --version`和`g++ --version`来验证GCC和G++是否已成功安装并查看其版本信息。 离线安装GCC/G++的这种方法对于那些在隔离网络环境中工作或者在多台服务器上部署相同...
### Linux 下 GCC、G++ 的用法和区别,以及 Makefile 的编写 #### GCC 和 G++ 编译流程 在 Linux 系统中,GCC (GNU Compiler Collection) 是一个非常强大的工具集,它包含了多种编程语言的编译器,如 C、C++、...
在Linux环境中,GCC(GNU Compiler Collection)和G++是开发者常用的重要工具,它们分别是C语言和C++语言的编译器。GCC不仅支持C和C++,还支持其他编程语言如Fortran、Objective-C等。G++是GCC的一个扩展,专门为C++...
GCC(GNU Compiler Collection)和G++是GNU项目的一部分,它们都是用于编译源代码的工具。G++实际上是一个前端程序,专门用于处理C++源代码,而GCC则是一个更广泛的编译器集合,支持多种编程语言,包括C、C++、...
在Linux环境下进行C++开发,GCC(GNU Compiler Collection)和G++是不可或缺的工具。GCC是一套由GNU项目开发的编程语言编译器,而G++是GCC的一部分,专门用于C++语言的编译。本离线安装包包含了在Linux系统上安装GCC...
在没有自动包管理器如yum的情况下,手动RPM安装GCC和g++是一项必要的任务。下面我们将详细讲解如何在Red Hat Linux上手动通过RPM包安装这两个组件。 首先,你需要获取适合你系统版本的GCC和g++的RPM包。通常,这些...
标题 "gcc-g++4.8.5离线安装包.rar" 涉及的是在Linux系统上安装GCC(GNU Compiler Collection)和G++(GNU C++编译器)的离线方法,具体版本为4.8.5。GCC是开源的、跨平台的编译器套件,它包括了C、C++、Fortran、...
gcc g++ gcc g++ gcc g++ gcc g++ gcc g++
从本质上讲,`GCC`和`G++`都是GNU项目下的编译器工具集,它们之间最显著的区别在于对C++特性的支持程度。`GCC`主要用于编译C语言程序,而`G++`则是专门为C++设计的,不仅支持C++的所有特性,还能自动处理C++标准库的...
在Linux操作系统中,GCC(GNU Compiler Collection)和G++是两个非常重要的编译器,用于将源代码编译成可执行程序。GCC主要处理C语言,而G++是GCC的一个扩展,专门针对C++编程语言。在64位的Linux系统上,由于默认...
在IT行业中,GCC(GNU Compiler Collection)和G++是至关重要的工具,它们分别用于编译C语言和C++语言的源代码。对于那些没有互联网连接或者网络环境受限的环境,如服务器集群或嵌入式系统,离线安装GCC和G++显得尤...
ubuntu下降级安装GCC-G++ 的必备依赖包之一,是GCC-G++能否安装成功的关键
本主题将深入探讨如何在Android设备上建立和使用GCC(GNU Compiler Collection)和G++(GNU C++ Compiler)编译环境,以实现C和C++代码的编译和执行。这个压缩包提供了必要的工具和步骤来实现这一目标。 首先,`...
这里,`gcc-X.Y` 和 `g++-X.Y` 分别代表不同版本的GCC和G++,`X.Y`表示版本号。同时,`-multilib` 表示支持多架构编译。这样就可以确保在编译时能够处理不同架构的代码。 #### 使用update-alternatives设置GCC和G++...
`gcc-g++-4.4.2` 是GCC的一个特定版本,发布于2009年,它包含了C++编译器g++和其他相关工具,如链接器和预处理器。这个版本的发布是为了提供对C++语言的新特性和改进,以及对其他编程语言的支持和优化。在4.4系列中...