c編譯器的擴展原理
㈠ c璇璦緇忚繃緙栬瘧鍚庣敓鎴愭枃浠剁殑鍚庣紑鏄
C璇璦緇忚繃緙栬瘧鍚庣敓鎴愭枃浠剁殑鍚庣紑鏄鈥.obj鈥濄
褰揅璇璦婧愪唬鐮佽緙栬瘧鍚庯紝閫氬父浼氱敓鎴愪竴涓鈥.o鈥濓紙object file錛夋枃浠躲傝繖涓鏂囦歡鍖呭惈浜嗙紪璇戝櫒鎵浜х敓鐨勬満鍣ㄤ唬鐮侊紝浣嗘槸瀹冭繕娌℃湁琚榪炴帴鍒板叾浠栨ā鍧楁垨搴撲腑銆傜浉搴斿湴錛屽湪涓嶅悓鐨勬搷浣滅郴緇熶笂鍙鑳戒細鏈変笉鍚岀殑鍚庣紑鍚嶅拰浜岃繘鍒舵牸寮忋備緥濡傦紝Windows涓婄殑Visual C++緙栬瘧鍣ㄤ嬌鐢ㄢ.obj鈥濅綔涓虹洰鏍囨枃浠剁殑鎵╁睍鍚嶃
闄や簡鐩鏍囨枃浠朵箣澶栵紝榪樻湁鍏朵粬綾誨瀷鐨勬枃浠朵篃鍙鑳藉湪緙栬瘧榪囩▼涓鍑虹幇銆備緥濡傦紝婧愭枃浠跺寘鍚浜嗕唬鐮佺殑鍘熷嬫枃鏈錛涘ご鏂囦歡鍖呭惈浜嗙▼搴忎腑浣跨敤鍒扮殑鍑芥暟鍜屽彉閲忕殑澹版槑銆傝繖浜涙枃浠舵墿灞曞悕閫氬父涓衡.c鈥濆拰鈥.h鈥濄
C璇璦鐨勪紭鐐圭畝榪
C璇璦鐨勮捐$洰鏍囨槸鎻愪緵涓縐嶈兘浠ョ畝鏄撶殑鏂瑰紡緙栬瘧銆佸勭悊浣庣駭瀛樺偍鍣ㄣ佷粎浜х敓灝戦噺鐨勬満鍣ㄧ爜浠ュ強涓嶉渶瑕佷換浣曡繍琛岀幆澧冩敮鎸佷究鑳借繍琛岀殑緙栫▼璇璦銆侰璇璦鎻忚堪闂棰樻瘮奼囩紪璇璦榪呴熴佸伐浣滈噺灝忋佸彲璇繪уソ銆佹槗浜庤皟璇曘佷慨鏀瑰拰縐繪嶏紝鑰屼唬鐮佽川閲忎笌奼囩紪璇璦鐩稿綋銆侰璇璦涓鑸鍙姣旀眹緙栬璦浠g爜鐢熸垚鐨勭洰鏍囩▼搴忔晥鐜囦綆10%鈥20%銆傚洜姝わ紝C璇璦鍙浠ョ紪鍐欑郴緇熻蔣浠躲
褰撳墠闃舵碉紝鍦ㄧ紪紼嬮嗗煙涓錛孋璇璦鐨勮繍鐢ㄩ潪甯鎬箣澶氾紝瀹冨吋欏句簡楂樼駭璇璦鍜屾眹緙栬璦鐨勪紭鐐癸紝鐩歌緝浜庡叾浠栫紪紼嬭璦鍏鋒湁杈冨ぇ浼樺娍銆傝$畻鏈虹郴緇熻捐′互鍙婂簲鐢ㄧ▼搴忕紪鍐欐槸C璇璦搴旂敤鐨勪袱澶ч嗗煙銆傚悓鏃訛紝C璇璦鐨勬櫘閫傝緝寮猴紝鍦ㄨ稿氳$畻鏈烘搷浣滅郴緇熶腑閮借兘澶熷緱鍒伴傜敤錛屼笖鏁堢巼鏄捐憲銆侰璇璦鎷ユ湁緇忚繃浜嗘極闀垮彂灞曞巻鍙茬殑瀹屾暣鐨勭悊璁轟綋緋伙紝鍦ㄧ紪紼嬭璦涓鍏鋒湁涓捐凍杞婚噸鐨勫湴浣嶃
㈡ 編譯器編譯原理:預處理,編譯,匯編,鏈接各步驟詳解
編譯器編譯原理:預處理,編譯,匯編,鏈接各步驟詳解
C和C++編譯器的編譯流程主要分為四個階段:預處理、編譯、匯編和鏈接。預處理階段主要處理源代碼中的宏定義和包含文件,將包含的文件內容插入到源代碼中。編譯階段則檢查代碼的語法正確性,並將其轉換為匯編語言。匯編階段將匯編語言轉換為二進制機器指令。鏈接階段則將生成的二進制文件與函數庫鏈接,以實現程序功能。
在預處理階段,編譯器會將源代碼中的文件包含進來,並且用戶可以使用Gcc選項」-E」查看預處理的結果。預處理階段主要處理# include和# define,它會將# include引用的.h文件插入到指定位置,並將源程序中使用到的宏替換為實際字元串。
編譯階段則檢查代碼的語法正確性,並將其轉換為匯編語言。用戶可以使用」-S」選項查看編譯結果。編譯階段生成的文件是文本文件,可以直接用文本處理工具閱讀。編譯階段可以接收.c和.i類型的文件。
匯編階段將匯編語言轉換為二進制機器指令,生成的目標文件可以直接執行。匯編階段可以接收.c, .i, .s的文件。
鏈接階段則將生成的目標文件與函數庫鏈接,實現程序功能。函數庫一般分為靜態庫和動態庫兩種,鏈接動態庫和靜態庫時使用的方法是一樣的,但是如果庫中存在同名的靜態庫文件和動態庫文件,鏈接時默認優先選擇動態庫。可以使用-static選項強制鏈接靜態庫文件。
完成鏈接後,編譯器生成可執行文件,可以直接執行。通過運行可執行文件,可以驗證程序功能是否實現。
㈢ c語言編譯後生成的文件擴展名為
C語言編譯後生成的文件擴展名通常為:
- .obj:在一些系統中,編譯器會將源代碼文件編譯成機器代碼,這些文件的後綴名通常為.obj。這些.obj文件之後會被鏈接器合並生成可執行文件。
- .exe:在Windows系統中,鏈接器將所有必要的.obj文件合並在一起生成的可執行文件的後綴名為.exe。
需要注意的是: 在一些Unix系統上,編譯器可能會生成後綴名為.o的文件,這與.obj文件類似,但命名約定不同。 在Windows上,用於動態鏈接庫的文件擴展名為.dll。 一些編譯器允許你通過特定選項指定輸出文件的擴展名。例如,GCC編譯器可以使用o選項來指定輸出文件的名稱和擴展名。
㈣ C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello
world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
㈤ C語言與C++究竟有啥關系
C語言與C++的關系主要體現在C++是對C語言的擴展。具體來說:
語言基礎與兼容性:
- C語言是許多編程語言的基礎,而C++可以看作是C的超集。這意味著所有C程序都能在C++編譯器中編譯,但C++程序不一定能在C編譯器中編譯,因為C++新增了一些C不具備的特性。
關鍵字與語法:
- C++增加了C中沒有的關鍵字,如typename、bool、dynamic_cast等。
- C++要求函數原型明確,而C允許省略無參數的函數原型。
內存管理與字元串處理:
- C++引入了new和delete來管理內存,而C使用malloc和free。
- 在處理字元串時,C++使用iostream類庫,而C依賴於字元數組函數。
數據類型與異常處理:
- C++引入了布爾類型bool和寬字元類型wchar_t,以及異常處理機制try/catch/throw,這些都是C所不具備的。
輸入輸出流:
- C++使用類如cin、cout和endl進行輸入輸出,而C使用scanf和printf。
函數特性:
- C++允許函數參數的無名使用和默認值,以及函數重載,這在C中是不支持的。
變數作用域與內存分配:
- C++的變數作用域更加靈活,可以在程序任何位置定義。
- C++允許重復定義變數。
- C++的new和delete提供了更直觀的內存管理方式。
引用類型:
- 引用類型是C++中的一項重要特性,它提供了高效的操作和避免深拷貝的優勢,這在C中是不存在的。
綜上所述,C++在C的基礎上擴展了特性,提供了更豐富的編程工具和內存管理方式,同時保持了與C的兼容性,使其能夠廣泛應用於不同領域。