Ubuntu16.04使用教程(三)--gcc與g++的使用

Utuntu 16.04自帶gcc與g++

gcc

  1. 編譯C文件

gcc file.c
默認(rèn)生成a.out文件

  1. 執(zhí)行a.out文件

./a.out

  1. 其他參數(shù)和命令
  • gcc -Wall file.c -o b //這里的Wall(W必須大寫) 表示warning all
    b 表示生成可執(zhí)行文件名字 (默認(rèn)生成a.out)
  • gcc --help

g++

  1. 編譯Cpp文件

gcc file.cpp
默認(rèn)生成a.out文件

  1. 執(zhí)行a.out文件

./a.out

  1. 其他參數(shù)和命令
  • g++ -Wall file.cpp -o b //這里的Wall(W必須大寫) 表示warning all
    b 表示生成可執(zhí)行文件名字 (默認(rèn)生成a.out)
  • g++ --help

誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼

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

  1. 后綴為.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**' tochar*”;”return-statement with no value“;分別對應(yīng)前面紅色標(biāo)注的部分。可見C++的語法規(guī)則更加嚴(yán)謹(jǐn)一些。

  1. 編譯階段,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;
} 
  1. 先給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完全相同!
  2. 去掉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完全相同!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容