1、編譯工具鏈:
預處理用預處理器,編譯用編譯器,彙編用彙編器,鏈結用鏈結器,這幾個工具再加上其他一些額外的會用到的可用工具,合起來叫編譯工具鏈。gcc就是乙個編譯工具鏈。
2、預處理的意義
(1)編譯器本身的主要目的是編譯源**,將c的源**轉化成.s的彙編**。編譯器聚焦核心功能後,就剝離出了一些非核心的功能到預處理器去了。
(2)預處理器幫編譯器做一些編譯前的雜事。
3、由原始碼到可執行程式的過程
(1)原始碼.c->(編譯)->elf可執行程式
(2)原始碼.c->(編譯)->目標檔案.o->(鏈結)->elf可執行程式
(3)原始碼.c->(編譯)->彙編檔案.s->(彙編)->目標檔案.o->(鏈結)->elf可執行程式
(4)原始碼.c->(預處理)->預處理過的.i原始檔->(編譯)->彙編檔案.s->(彙編)->目標檔案.o->(鏈結)->elf可執行程式
4、程式設計中常見的預處理
(1)#include(#include <>和#include ""的區別)
(2)注釋
(3)#if #elif #endif #ifdef
(4)巨集定義
巨集定義的解析規則就是:在預處理階段由預處理器進行替換,這個替換是原封不動的替換。
巨集定義被預處理時的現象有:
第一,巨集定義語句本身不見了(可見編譯器根本就不認識#define,編譯器根本不知道還有個巨集定義);
第二,typedef重新命名語言還在,說明它和巨集定義是有本質區別的(說明typedef是由編譯器來處理而不是預處理器處理的);
巨集定義是在預處理期間處理的,而函式是在編譯期間處理的。
巨集定義示例2:sec_per_year,用巨集定義表示一年中有多少秒
#define sec_per_year (365*24*60*60ul)
關鍵:第一點:當乙個數字直接出現在程式中時,它的是型別預設是int
第二點:一年有多少秒,這個數字剛好超過了int型別儲存的範圍
5、gcc中只預處理不編譯的方法
(1)gcc編譯時可以給一些引數來做一些設定,譬如gcc xx.c -o xx可以指定可執行程式的名稱;譬如gcc xx.c -c -o xx.o可以指定只編譯不連線,也可以生成.o的目標檔案。
(2)gcc -e xx.c -o xx.i可以實現只預處理不編譯。一般情況下沒必要只預處理不編譯,但有時候這種技巧可以用來幫助我們研究預處理過程,幫助debug程式。
預處理與巨集定義 筆記
2017 09 18 10 45 21 預處理1.預處理的指令和功能 以 開頭的語句 include 檔案包含 include 在標準庫下面找 include stdio.h 在當前工作路徑下查詢 自定義標頭檔案的包含形式 區別 查詢的路徑不相同 define 巨集定義 不帶引數的巨集和帶引數的巨集...
預處理 巨集定義
1,預處理 預處理是指在進行編譯的第一遍掃瞄 詞法掃瞄和語法分析 之前所作的工作。預處理是 語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。語言提供了多種預處理功能,如巨集定義 檔案包含 條件...
C 預處理 巨集定義
開發乙個 c語言程式,讓它暫停 5 秒以後再輸出內容 helllo 並且要求跨平台,在 windows 和 linux 下 include 說明 在windows 作業系統和 linux作業系統下,生成原始碼不一樣 if win32 如果是windows平台,就執行 include elif lin...