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 兩...