学习笔记15-C语言-预处理指令、条件编译、头文件
生活随笔
收集整理的這篇文章主要介紹了
学习笔记15-C语言-预处理指令、条件编译、头文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
預(yù)處理指令:
程序猿編寫的代碼不是標(biāo)準(zhǔn)C代碼,并不能被真正的編譯器索編譯,需要一段程序把代碼翻譯一下。 翻譯的過程叫做預(yù)處理,被翻譯的代碼叫做預(yù)處理指令,以#開頭的都是預(yù)處理指令查看預(yù)處理的過程:gcc -E code.c 把預(yù)處理結(jié)果顯示在終端上gcc -E code.c -o code.i 把預(yù)處理的結(jié)果存儲到code.i文件中預(yù)處理指令的分類:#inlcude 文件包含#include<> 從系統(tǒng)指定目錄下查找并導(dǎo)入頭文件#include"" 先從文件當(dāng)前目錄下找,找到就導(dǎo)入該頭文件;如果找不到,再從系統(tǒng)指定目錄下找并導(dǎo)入頭文件操作系統(tǒng)通過環(huán)境變量來指定頭文件的查找路徑,或者通過設(shè)置編譯參數(shù)來指定頭文件的查找路徑-I/path.bashrc#define 宏定義宏常量: #define MAX 100優(yōu)點:提高代碼的擴(kuò)展性(方便批量修改)、提高可讀性、提高安全性、還可以在case后面使用注意:一般宏名全部大寫,末尾不要加分號【局部變量全部小寫、全局變量首字母大寫、指針變量+p、數(shù)組arr、字符串str、函數(shù)名全部小寫+下劃線】預(yù)定義好的宏:__func__ 獲取函數(shù)名__FILE__ 獲取文件名__LINE__ 獲取當(dāng)前行號__DATE__ 獲取當(dāng)前日期__TIME__ 獲取運(yùn)行時間宏函數(shù): 其實就是帶參數(shù)的宏宏函數(shù)不是真正的函數(shù),不檢查參數(shù)類型,沒有傳參,沒有返回值,只有計算的結(jié)果#define sum(a,b) a+b1、把代碼使用到的宏函數(shù)替換為宏函數(shù)后面的代碼。2、再把宏函數(shù)代碼中使用到的參數(shù)替換為調(diào)用者提供的參數(shù)宏函數(shù)的二義性:由于宏代碼所處的位置、參數(shù)不同導(dǎo)致宏有不同的功能,這就叫做宏的二義性。如何避免宏的二義性:1、宏函數(shù)整體加小括號,每個參數(shù)都加小括號2、使用宏函數(shù)時,不要提供帶自變運(yùn)算符的變量作為參數(shù)注意1:容易出選擇題,例如:哪個宏有二義性、宏函數(shù)的運(yùn)算結(jié)果注意2:定義宏盡量別換行,如果要換行要在每行末尾加上續(xù)航符\,建議宏函數(shù)最外面加上大括號運(yùn)算符:# 把宏函數(shù)的參數(shù)變成字符串## 合并兩個參數(shù)變成一個標(biāo)識符普通函數(shù)與宏函數(shù)的區(qū)別?它們是什么:普通函數(shù):是一段具有某項功能的代碼段,會被編譯成二進(jìn)制指令存儲到代碼段內(nèi)存中,函數(shù)名就是首地址,有獨(dú)立的命名空間、棧內(nèi)存宏函數(shù):是一個帶參數(shù)的宏,并不是真正的函數(shù),而只是代碼的替換,僅僅只是使用起來像函數(shù)有什么不一樣:函數(shù): 返回值 類型檢查 安全 壓棧、出棧 速度慢 跳轉(zhuǎn)宏函數(shù): 運(yùn)算結(jié)果 通用 危險 替換 速度快 冗余條件編譯:根據(jù)條件決定那些代碼是否參與最終的編譯版本控制:#if#elif#else#endif頭文件衛(wèi)士:防止頭文件被重復(fù)包含#ifndef 宏名#define 宏名#endif 判斷調(diào)試:#ifdef 宏名(DEBUG)#else#endif用于輸出調(diào)試信息:#ifdef DEBUG#define debug(...) printf(__VA_ARGS__)#else #define debug(...)#endif#define error(...) printf("%s:%s:%d %s:%m %s %s\n",__FILE__,__func__,__LINE__,__VA_ARGS__,__DATE__,__TIME__)頭文件應(yīng)該怎么寫:
問題:頭文件可能被任意個源文件包含,意味著頭文件中的內(nèi)容會在多個目標(biāo)文件中存在,合并時不能有沖突。 重點:頭文件中只能編寫聲明語句,不能有定義語句全局變量聲明 extern int num;函數(shù)聲明 宏常量宏函數(shù)typedef 類型重定義結(jié)構(gòu)、聯(lián)合、枚舉的類型聲明頭文件的編寫原則:
1、為每一個.c文件編寫一份.h文件,.h文件是對.c文件的說明 2、如果需要用到某個.c文件中的函數(shù)、變量、宏,只需要把它的頭文件導(dǎo)入 3、.c也需要導(dǎo)入它的.h文件,目的是為了讓聲明和定義一致頭文件的相互包含:
假如a.h包含了b.h,b.h有需要包含a.h,這種情況叫做頭文件的相互包含,這種情況就會編譯出錯。 錯誤:未知類型名錯誤“xxx”,一般都是因為頭文件相互包含導(dǎo)致的(還可能是復(fù)制文件時粗心,忘記改宏名) 解決方案:把a(bǔ).h中需要的內(nèi)容,和b.h中需要的內(nèi)容提取出來,編寫一個c.h 注意:頭文件的相互包含和重復(fù)包含的區(qū)別總結(jié)
以上是生活随笔為你收集整理的学习笔记15-C语言-预处理指令、条件编译、头文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式Linux之移植dropbear
- 下一篇: 计算机lab模式适用于,计算机考证二级选