posts - 134,comments - 22,trackbacks - 0
          轉(zhuǎn)http://www.yuanma.org/data/2007/0406/article_2498.htm

          gcc和g++都是GNU(組織)的一個(gè)編譯器。

          誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼
          兩者都可以,但是請(qǐng)注意:
          1.后綴為.c的,gcc把它當(dāng)作是C程序,而g++當(dāng)作是c++程序;后綴為.cpp的,兩者都會(huì)認(rèn)為是c++程序,注意,雖然c++是c的超集,但是兩者對(duì)語(yǔ)法的要求是有區(qū)別的。C++的語(yǔ)法規(guī)則更加嚴(yán)謹(jǐn)一些。
          2.編譯階段,g++會(huì)調(diào)用gcc,對(duì)于c++代碼,兩者是等價(jià)的,但是因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)聯(lián)接,所以通常用g++來(lái)完成鏈接,為了統(tǒng)一起見(jiàn),干脆編譯/鏈接統(tǒng)統(tǒng)用g++了,這就給人一種錯(cuò)覺(jué),好像cpp程序只能用g++似的。
           
          誤區(qū)二:gcc不會(huì)定義__cplusplus宏,而g++會(huì)
          實(shí)際上,這個(gè)宏只是標(biāo)志著編譯器將會(huì)把代碼按C還是C++語(yǔ)法來(lái)解釋?zhuān)缟纤觯绻缶Y為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
           
          誤區(qū)三:編譯只能用gcc,鏈接只能用g++
          嚴(yán)格來(lái)說(shuō),這句話不算錯(cuò)誤,但是它混淆了概念,應(yīng)該這樣說(shuō):編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)聯(lián)接,所以通常使用g++來(lái)完成聯(lián)接。但在編譯階段,g++會(huì)自動(dòng)調(diào)用gcc,二者等價(jià)。


          誤區(qū)四:extern "C"與gcc/g++有關(guān)系

          實(shí)際上并無(wú)關(guān)系,無(wú)論是gcc還是g++,用extern "c"時(shí),都是以C的命名方式來(lái)為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
          完全相同!
          【結(jié)論】完全相同,可見(jiàn)extern "C"與采用gcc/g++并無(wú)關(guān)系,以上的試驗(yàn)還間接的印證了前面的說(shuō)法:在編譯階段,g++是調(diào)用gcc的。


          posted on 2009-02-13 11:25 何克勤 閱讀(211) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): C/C++GNU Linux/Unix
          主站蜘蛛池模板: 株洲市| 关岭| 龙胜| 广元市| 阿克陶县| 孟村| 三门峡市| 湘潭市| 亚东县| 英德市| 神木县| 定西市| 青铜峡市| 辽宁省| 建昌县| 龙口市| 内江市| 巩留县| 林周县| 包头市| 唐海县| 洛扎县| 大关县| 茂名市| 察雅县| 虹口区| 宁强县| 乌拉特后旗| 临江市| 旬阳县| 洞头县| 嵩明县| 普陀区| 丰城市| 兴安县| 荥经县| 固原市| 循化| 龙井市| 灵台县| 滦南县|