C/C++編譯相關

1、編譯與鏈接的區別是什么?

在多道程序環境中,想將用戶源代碼變成一個可在內存中執行的程序,通常可分為三步:編譯、鏈接和載入。

  • 編譯
    將預處理生成的文件,通過詞法分析、語法分析、語義分析以及優化后編譯成若干目標模塊。可以理解為將高級語言翻譯成二進制代碼的機器語言。windows下編譯成.obj文件,Linux下編譯成.o文件。

  • 鏈接
    由鏈接程序,將編譯后形成的一組目標模塊以及它們所需要的庫函數鏈接在一起,形成一個完整的載入模型。鏈接主要解決相互引用的問題,分為地址和空間分配,符號解析和重定位幾個步驟。在編譯階段生成目標文件時,會暫時擱置那些外部引用,而這些外部引用就是在鏈接時確定的。鏈接器在鏈接時,會根據符號名稱去相應模塊中尋找對應符號。帶符號確定后,鏈接器會重寫之前未確定的符號地址,這個過程稱為重定位。鏈接一般分為:靜態鏈接,載入時動態鏈接和運行時動態鏈接三種。

  • 載入
    由載入程序將載入模塊載入內存。

編譯和鏈接是為將用戶程序從硬盤上調入內存并將其轉化為可執行程序服務的。編譯時,編譯器需要的是語法正確,函數與變量的聲明正確。一般而言,每個源文件都應該對應于一個中間目標文件。鏈接時,主要是鏈接函數和全局變量,所以可以采用這些中間目標文件來鏈接應用程序。鏈接就是目標文件相互鏈接自己需要的函數和全局變量,而函數可能源于其他目標文件或庫文件。

2、編譯型語言與解釋型語言的區別是什么?

  • 編譯型語言
    編譯型語言是指應用源程序執行之前,就將程序源代碼“翻譯”成目標代碼(“機器語言”)保存在另一個文件中,因此目標程序可以脫離語言環境獨立執行多次,使用比較方便,效率較高。但應用程序一旦需要修改,必須先修改源代碼,只有目標文件沒有源代碼,則修改很困難。大多數軟件產品都是應目標程序形式發布給用戶,不僅可以直接運行,還可以使他人難以盜用其中的技術。C/C++/Fortran/Visual Foxpro/Psacal/Delphi等都是編譯型語言。

  • 解釋型語言
    解釋型語言相對于編譯型語言存在的,源代碼不是直接翻譯成機器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。解釋程序的任務是逐一將源程序的語句解釋成可以執行的機器指令,不需要編譯鏈接成目標代碼后再執行,當語句出現語法錯誤,解釋器可以立刻引起程序員的注意,程序員可以在開發階段進行校正。每條語句只有在執行時,才被翻譯,解釋程序每執行一次,就翻譯一次,因此效率低下且依賴解釋器,但是其跨平臺性好。Python/JavaScript / Perl /Shell等都是解釋型語言。

Java是一類特殊的編程語言,其程序也需要編譯,但是卻沒有直接編譯稱為機器語言,而編譯為字節碼,然后在Java虛擬機上一解釋方式執行字節碼。

3、如何判斷一段程序是由C編譯的還是由C++編譯的?

如果編譯器在編譯cpp文件,那么自定義宏_cpluslus就會被定義,如果是一個c文件被編譯,那么_STDC_就會被定義。_STDC_是預定義宏,當它被定義后,編譯器會按照ANSIC的標準來編譯C語言程序。

C與C++編譯方式不同。編寫C/C++的兼容代碼,需要如下格式:

#ifdef _cplusplus
  extern "C"{
#endif
      //code
#ifdef _cplusplus
  };
#endif

4、extern “C”的作用是什么?

C++是一種面向對象語言,支持函數重載,而C語言是面向過程語言,不支持函數重載,所以函數在被C++編譯后再庫中的名字與C語言不同。如果聲明一個float f(int a, char b),C語言一般使用類似_f的內部名,而C++則將參數連在其中,內部名類似_f_int_char。因此,鏈接器無法解釋C++程序對C語言函數f的調用。

C++提供了C語言替代連接說明符號extern "C"來解決名字匹配問題,該語句用在函數前:extern "C" float f(int a, char b),其目的是告訴編譯器f()是C連接的,不需要按照C++的方式轉換函數名,這樣就可以正確鏈接到f()函數了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容