Utuntu 16.04自帶gcc與g++
gcc
- 編譯C文件
gcc file.c
默認(rèn)生成a.out文件
- 執(zhí)行a.out文件
./a.out
- 其他參數(shù)和命令
- gcc -Wall file.c -o b //這里的Wall(W必須大寫) 表示warning all
b 表示生成可執(zhí)行文件名字 (默認(rèn)生成a.out) - gcc --help
g++
- 編譯Cpp文件
gcc file.cpp
默認(rèn)生成a.out文件
- 執(zhí)行a.out文件
./a.out
- 其他參數(shù)和命令
- g++ -Wall file.cpp -o b //這里的Wall(W必須大寫) 表示warning all
b 表示生成可執(zhí)行文件名字 (默認(rèn)生成a.out) - g++ --help
誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意:
- 后綴為.c的,gcc把它當(dāng)作是C程序,而g++當(dāng)作是c++程序;后綴為.cpp的,兩者都會認(rèn)為是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區(qū)別的,
例如:
#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的語法規(guī)則,OK,沒問題,但是,一旦把后綴改為cpp,立刻報三個錯:“printString未定義”;“cannot convert char**' to
char*”;”return-statement with no value“;分別對應(yīng)前面紅色標(biāo)注的部分。可見C++的語法規(guī)則更加嚴(yán)謹(jǐn)一些。
- 編譯階段,g++會調(diào)用gcc,對于c++代碼,兩者是等價的,但是因?yàn)間cc命令不能自動和C++程序使用的庫聯(lián)接,所以通常用g++來完成鏈接,為了統(tǒng)一起見,干脆編譯/鏈接統(tǒng)統(tǒng)用g++了,這就給人一種錯覺,好像cpp程序只能用g++似的。
誤區(qū)二:gcc不會定義__cplusplus宏,而g++會
實(shí)際上,這個宏只是標(biāo)志著編譯器將會把代碼按C還是C++語法來解釋,如上所述,如果后綴為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
誤區(qū)三:編譯只能用gcc,鏈接只能用g++
嚴(yán)格來說,這句話不算錯誤,但是它混淆了概念,應(yīng)該這樣說:編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因?yàn)間cc命令不能自動和C++程序使用的庫聯(lián)接,所以通常使用g++來完成聯(lián)接。但在編譯階段,g++會自動調(diào)用gcc,二者等價。
誤區(qū)四:extern "C"與gcc/g++有關(guān)系
實(shí)際上并無關(guān)系,無論是gcc還是g++,用extern "c"時,都是以C的命名方式來為symbol命名,否則,都以c++方式命名。試驗(yàn)如下: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;
}
- 先給me.h加上extern "C",看用gcc和g++命名有什么不同
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函數(shù)的命名
.type CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函數(shù)的命名
.type CppPrintf, @function完全相同! - 去掉me.h中extern "C",看用gcc和g++命名有什么不同
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函數(shù)的命名
.type _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s.globl _Z9CppPrintfv //注意此函數(shù)的命名
.type _Z9CppPrintfv, @function完全相同!