編譯預(yù)處理

對(duì)于編譯預(yù)處理我還不太理解他的具體用處,反正在編寫時(shí)需要寫在開頭。我比較常用的三個(gè):#include <stdio.h>,#include <stdlib.h>,#include <string.h>。
下面還是需要把一些知識(shí)點(diǎn)整理一下,便于以后的回顧和總結(jié),

  • C預(yù)處理器在程序執(zhí)行之前查看程序,根據(jù)程序中的預(yù)處理指令,預(yù)處理器把符號(hào)縮寫替換成其表示的內(nèi)容。
    在該階段,編譯器將上述代碼中的stdio.h編譯進(jìn)來,并且用戶可以使用Gcc的選項(xiàng)"-E"進(jìn)行查看,該選項(xiàng)的作用是讓gcc在預(yù)處理結(jié)束后停止編譯過程。
    具體包括以下過程:
    1、將所有的#define刪除,并且展開所有的宏定義;
    2、處理所有的條件預(yù)編譯指令,比如#if #ifdef #elif #else #endif等;
    3、處理#include 預(yù)編譯指令,將被包含的文件插入到該預(yù)編譯指令的位置。
    4、刪除所有注釋 “//”和”/* */”.
    5、添加行號(hào)和文件標(biāo)識(shí),以便編譯時(shí)產(chǎn)生調(diào)試用的行號(hào)及編譯錯(cuò)誤警告行號(hào)。

在預(yù)處理之前,編譯器必須對(duì)該程序進(jìn)行一些翻譯

1.編譯器把源代碼中出現(xiàn)的字符映射到源字符集。
2.編譯器定位每個(gè)反斜杠后面跟著的換行符并且刪除他們。
3.編譯器把文本分成預(yù)處理記號(hào)序列、空白序列和注釋序列

#define

  • /#define 預(yù)處理執(zhí)行和其他預(yù)處理指令一樣,以#開始。它2可以出現(xiàn)在程序的任何位置,其定義從指令出現(xiàn)的地方到該文件末尾有效。
    我感覺這個(gè)用的比較多的就是定義符號(hào)常量。例如#define PI 3.14159.
  • 每行#define都由三部分組成
    /#define PX printf("x is %d.\n",x);
    預(yù)處理指令 宏 替換體

宏和函數(shù)的選擇

宏和函數(shù)的選擇實(shí)際上是時(shí)間和空間上的權(quán)衡。宏在編譯的時(shí)候在程序中生成語句,如果調(diào)用20次宏即在程序中插入20行代碼。如果調(diào)用20次函數(shù),程序中只有一份函數(shù)的語句的副本,所以節(jié)省了空間。然而另一方面,程序的控制必須跳轉(zhuǎn)到函數(shù)內(nèi),然后再返回主調(diào)程序中,這比直接在程序中生成代碼浪費(fèi)更多的時(shí)間。

簡單來說宏比函數(shù)浪費(fèi)空間,函數(shù)比宏浪費(fèi)時(shí)間。

頭文件包含:#include

  • / #include 指令有兩種形式:(尖括號(hào)和引號(hào))
    / #include <stdio.h> <--查找系統(tǒng)目錄
    / #include "hot.h" <--查找當(dāng)前目錄
    引號(hào)還是不錯(cuò)的可以將一個(gè)文件一分為三,便于查錯(cuò)。
    例如:一個(gè)phone.c的文件,分為phone.h;menu.c;main.c。
  • phone.h:
#ifndef _MUNU_H_
#define _MUNU_H_
結(jié)構(gòu)體
頭文件
#endif
  • menu.c
#include "phone.h"
函數(shù)的主體文件,main函數(shù)和結(jié)構(gòu)體除外。
  • main.c
#include "phone.h"
main函數(shù)

···

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容