您的位置:首页 > 其它

gcc和g++的区别

2008-04-01 12:39 357 查看
gcc

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

G++&GCC
的几大误区
:

误区一
: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
,二者等价

误区四
: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
的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: