日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记15-C语言-预处理指令、条件编译、头文件

發(fā)布時(shí)間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记15-C语言-预处理指令、条件编译、头文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

預(yù)處理指令:

程序猿編寫的代碼不是標(biāo)準(zhǔn)C代碼,并不能被真正的編譯器索編譯,需要一段程序把代碼翻譯一下。 翻譯的過(guò)程叫做預(yù)處理,被翻譯的代碼叫做預(yù)處理指令,以#開頭的都是預(yù)處理指令查看預(yù)處理的過(guò)程:gcc -E code.c 把預(yù)處理結(jié)果顯示在終端上gcc -E code.c -o code.i 把預(yù)處理的結(jié)果存儲(chǔ)到code.i文件中預(yù)處理指令的分類:#inlcude 文件包含#include<> 從系統(tǒng)指定目錄下查找并導(dǎo)入頭文件#include"" 先從文件當(dāng)前目錄下找,找到就導(dǎo)入該頭文件;如果找不到,再?gòu)南到y(tǒng)指定目錄下找并導(dǎo)入頭文件操作系統(tǒng)通過(guò)環(huán)境變量來(lái)指定頭文件的查找路徑,或者通過(guò)設(shè)置編譯參數(shù)來(lái)指定頭文件的查找路徑-I/path.bashrc#define 宏定義宏常量: #define MAX 100優(yōu)點(diǎn):提高代碼的擴(kuò)展性(方便批量修改)、提高可讀性、提高安全性、還可以在case后面使用注意:一般宏名全部大寫,末尾不要加分號(hào)【局部變量全部小寫、全局變量首字母大寫、指針變量+p、數(shù)組arr、字符串str、函數(shù)名全部小寫+下劃線】預(yù)定義好的宏:__func__ 獲取函數(shù)名__FILE__ 獲取文件名__LINE__ 獲取當(dāng)前行號(hào)__DATE__ 獲取當(dāng)前日期__TIME__ 獲取運(yùn)行時(shí)間宏函數(shù): 其實(shí)就是帶參數(shù)的宏宏函數(shù)不是真正的函數(shù),不檢查參數(shù)類型,沒有傳參,沒有返回值,只有計(jì)算的結(jié)果#define sum(a,b) a+b1、把代碼使用到的宏函數(shù)替換為宏函數(shù)后面的代碼。2、再把宏函數(shù)代碼中使用到的參數(shù)替換為調(diào)用者提供的參數(shù)宏函數(shù)的二義性:由于宏代碼所處的位置、參數(shù)不同導(dǎo)致宏有不同的功能,這就叫做宏的二義性。如何避免宏的二義性:1、宏函數(shù)整體加小括號(hào),每個(gè)參數(shù)都加小括號(hào)2、使用宏函數(shù)時(shí),不要提供帶自變運(yùn)算符的變量作為參數(shù)注意1:容易出選擇題,例如:哪個(gè)宏有二義性、宏函數(shù)的運(yùn)算結(jié)果注意2:定義宏盡量別換行,如果要換行要在每行末尾加上續(xù)航符\,建議宏函數(shù)最外面加上大括號(hào)運(yùn)算符:# 把宏函數(shù)的參數(shù)變成字符串## 合并兩個(gè)參數(shù)變成一個(gè)標(biāo)識(shí)符普通函數(shù)與宏函數(shù)的區(qū)別?它們是什么:普通函數(shù):是一段具有某項(xiàng)功能的代碼段,會(huì)被編譯成二進(jìn)制指令存儲(chǔ)到代碼段內(nèi)存中,函數(shù)名就是首地址,有獨(dú)立的命名空間、棧內(nèi)存宏函數(shù):是一個(gè)帶參數(shù)的宏,并不是真正的函數(shù),而只是代碼的替換,僅僅只是使用起來(lái)像函數(shù)有什么不一樣:函數(shù): 返回值 類型檢查 安全 壓棧、出棧 速度慢 跳轉(zhuǎn)宏函數(shù): 運(yùn)算結(jié)果 通用 危險(xiǎn) 替換 速度快 冗余條件編譯:根據(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)該怎么寫:

問題:頭文件可能被任意個(gè)源文件包含,意味著頭文件中的內(nèi)容會(huì)在多個(gè)目標(biāo)文件中存在,合并時(shí)不能有沖突。 重點(diǎn):頭文件中只能編寫聲明語(yǔ)句,不能有定義語(yǔ)句全局變量聲明 extern int num;函數(shù)聲明 宏常量宏函數(shù)typedef 類型重定義結(jié)構(gòu)、聯(lián)合、枚舉的類型聲明

頭文件的編寫原則:

1、為每一個(gè).c文件編寫一份.h文件,.h文件是對(duì).c文件的說(shuō)明 2、如果需要用到某個(gè).c文件中的函數(shù)、變量、宏,只需要把它的頭文件導(dǎo)入 3、.c也需要導(dǎo)入它的.h文件,目的是為了讓聲明和定義一致

頭文件的相互包含:

假如a.h包含了b.h,b.h有需要包含a.h,這種情況叫做頭文件的相互包含,這種情況就會(huì)編譯出錯(cuò)。 錯(cuò)誤:未知類型名錯(cuò)誤“xxx”,一般都是因?yàn)轭^文件相互包含導(dǎo)致的(還可能是復(fù)制文件時(shí)粗心,忘記改宏名) 解決方案:把a(bǔ).h中需要的內(nèi)容,和b.h中需要的內(nèi)容提取出來(lái),編寫一個(gè)c.h 注意:頭文件的相互包含和重復(fù)包含的區(qū)別

總結(jié)

以上是生活随笔為你收集整理的学习笔记15-C语言-预处理指令、条件编译、头文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。