GNU組織的 gcc 和 g 的區別詳解

2021-07-04 12:52:56 字數 2543 閱讀 1836



gcc 和 g++ 都是 gnu 組織的編譯器。

誤區一: gcc 只能編譯 c **,g++ 只能編譯 c++ **

兩者都可以,但是請注意:

1. 字尾為 .c 的,gcc 把它當作是 c 程式,而 g++ 當作是 c++ 程式;

字尾為.cpp的,兩者都會認為是 c++程式;

注意: 雖然 c++ 是 c 的超集,但是兩者對語法的要求是有區別的! c++ 的語法規則更加嚴謹一些。

例如:#include

int

main( int 

argc,

char *argv )

printstring( argv );

return;

}

intprintstring( char* string )

如果按照 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++,而鏈結可以用 g++ 或者 gcc -lstdc++。

因為 gcc 命令不能自動和 c++ 庫鏈結,所以通常使用 g++ 來完成鏈結。

但在編譯階段,g++ 會自動呼叫 gcc,二者等價。

誤區四: extern "c" 與 gcc 或 g++ 有關係

實際上並無關係,

無論是 gcc 還是 g++,用 extern "c" 時,都是以 c 的命名方式來為 函式 命名,

否則,都以 c++ 方式為 函式 命名。

試驗如下:

test.h:

extern "c" void cppprintf(void);

test.cpp:

#include

#include "test.h"

using namespace std;

void

cppprintf( void )

main.cpp:

#include

#include

#include "test.h"

intmain( void )

1. 先給 test.h 裡的 void cppprintf(void); 加上 extern "c",看用 gcc 和 g++ 命名有什麼不同。

$ g++ -s test.cpp

$ less test.s

.globl 

cppprintf

<-- 注意此函式的命名

.type

cppprintf, @function

$ gcc -s test.cpp

$ less test.s

.globl 

cppprintf

<-- 注意此函式的命名

.type 

cppprintf, @function

完全相同!

2. 去掉 test.h 裡 void cppprintf(void); 前面的 extern "c",看用 gcc 和 g++ 命名有什麼不同。

$g++ -s test.cpp

$less test.s

.globl 

_z9cppprintfv

<-- 注意此函式的命名

.type 

_z9cppprintfv, @function

$ gcc -s test.cpp

$ less test.s

.globl 

_z9cppprintfv

<-- 注意此函式的命名

.type 

_z9cppprintfv, @function

完全相同!

結論:完全相同,可見 extern "c" 與採用 gcc 或 g++ 並無關係,

以上的試驗還間接的印證了前面的說法:在編譯階段,g++ 是呼叫 gcc 的。

gcc和g 的區別

gcc和g 都是gnu 組織 的乙個編譯器。誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些...

GCC和G 的區別

gcc和g 都是gnu 組織 的乙個編譯器。誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些...

gcc和g 的區別

誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些。2.編譯階段,g 會呼叫gcc,對於c 兩...