一、由源碼到可執(zhí)行程序的過程
- 源碼.c-(編譯)->elf可執(zhí)行程序
- 源代碼.c-(編譯)->目標(biāo)文件.o-(鏈接)->elf可執(zhí)行程序
- 源代碼.c-(編譯)->匯編文件.s-(匯編)->目標(biāo)文件.o-(鏈接)->elf可執(zhí)行程序
- 源代碼.c-(預(yù)處理)->預(yù)處理過的.i-(編譯)->匯編文件.s-(匯編)->目標(biāo)文件.o-(鏈接)->elf可執(zhí)行程序
- 預(yù)處理用的是預(yù)處理器街立,匯編用的是匯編器舶衬,鏈接用的是鏈接器。合起來叫編譯工具鏈赎离。gcc就是編譯工具鏈逛犹。
二、預(yù)處理的意義
- 編譯器本身主要目的是編譯源代碼梁剔,將c的源代碼轉(zhuǎn)化成.s的匯編代碼虽画。編譯器聚焦核心功能后剝離出了一些非核心的功能給預(yù)處理器。
- 預(yù)處理器幫編譯器做些編譯前的雜事荣病。
三码撰、編碼中常見的預(yù)處理
#include <>
//和
#include “”
#if
#elif
#endif
#ifdef
- 宏定義
四、gcc中只預(yù)處理不編譯的方法
- gcc編譯時可以給一些參數(shù)做一些設(shè)置个盆,譬如gcc xx.c-o xx可指定可執(zhí)行程序的名字脖岛;比如gcc xx.c-c-o xx.o可指定只編譯不鏈接,可以生成.o的目標(biāo)文件颊亮。
- gcc-E xx.c-o xx.i柴梆,可以實現(xiàn)只預(yù)處理不編譯。-o的意思是文件命名终惑⌒裕可以幫助debug程序。
#define pchar char*
#typedef char* PCHAR
int main(void)
{
pchar p1;
pchar p2,p3;
PCHAR p4,p5;
return 0;
}
經(jīng)過預(yù)處理后:
#typedef char* PCHAR
int main(void)
{
char* p1;
char* p2,p3;
PCHAR p4,p5;
return 0;
}
- 宏定義語句本身不見了狠鸳,可見在編譯器這個層次根本不知道還有個宏定義。宏定義在預(yù)處理就完成了悯嗓。
- typedef重定義語句還在件舵,說明重命名和宏定義有本質(zhì)區(qū)別。重定義是在編譯器中完成的脯厨。
- 預(yù)處理后pchar完全被char*替代了铅祸。