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 编译器,则该宏就是未定义的,否则,就是已定义。
实际上,这个宏只是标志着编译器将会把代码按 C 还是 C++ 语法来解释,如上所述,如果后缀为 .c ,并且采用 gcc 编译器,则该宏就是未定义的,否则,就是已定义。
误区三
:
编译只能用
gcc
,链接只能用
g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用 gcc/g++ ,而链接可以用 g++ 或者 gcc -lstdc++ 。因为 gcc 命令不能自动和 C ++程序使用的库联接,所以通常使用 g++ 来完成联接。但在编译阶段, g++ 会自动调用 gcc ,二者等价
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用 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";
}
#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;
}
#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]# 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
完全相同!
[root@root G++]# less me.s
.globl _Z9CppPrintfv // 注意此函数的命名
.type _Z9CppPrintfv, @function
完全相同!
【结论】
完全相同,可见
extern "C"
与采用
gcc/g++
并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,
g++
是调用
gcc
的。