C语言深度剖析书籍学习记录 第三章 预处理
生活随笔
收集整理的這篇文章主要介紹了
C语言深度剖析书籍学习记录 第三章 预处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?宏
- _LINE_ 表示正在編譯的文件的行號(hào)
- _FILE_ 表示正在編譯的文件的名字
- _DATE_ 表示編譯時(shí)刻的日期字符串,例如: "25 Dec 2007"
- _TIME_ 表示編譯時(shí)刻的時(shí)間字符串,例如: "12:30:55"
- _STDC_ 判斷該文件是不是定義成標(biāo)準(zhǔn) C 程序
- 宏名的書(shū)寫(xiě)由標(biāo)識(shí)符與兩邊各二條下劃線構(gòu)成
- #define PI 3.141592654
- const 修飾的不是常量而是 readonly 的變量,const 修飾的只讀變量不能用來(lái)作為定義數(shù)組的維數(shù), 也不能放在 case 關(guān)鍵字后面。
- #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3? 路徑使用雙 反斜杠? ?單\ 表示連接符
?
- 宏的生命周期從#define 開(kāi)始到#undef 結(jié)束?
條件編譯
- 條件編譯的功能使得我們可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。這對(duì)于程序的移植和調(diào)試是很有用的。
- 條件編譯有三種形式
?
?文件包含
- 文件包含是將多個(gè)源文件鏈接形成一個(gè)源文件進(jìn)行編譯,形成一個(gè)目標(biāo)文件
- #include<>?預(yù)處理到 系統(tǒng)規(guī)定的路徑中去獲得這個(gè)文件(即 C 編譯系統(tǒng)所提供的并存放在指定的子目錄下的頭 文件)。找到文件后,用文件內(nèi)容替換該語(yǔ)句
- filename 為要包含的文件名稱(chēng)。雙引號(hào)表示預(yù)處理應(yīng)在當(dāng)前目錄中查找文件名為 filename 的文件,若沒(méi)有找到,則按系統(tǒng)指定的路徑信息,搜索其他目錄。找到文件后,用 文件內(nèi)容替換該語(yǔ)句。
- 需要強(qiáng)調(diào)的一點(diǎn)是:#include 是將已存在文件的內(nèi)容嵌入到當(dāng)前文件中。 另外關(guān)于#include 的路徑也有點(diǎn)要說(shuō)明:include 支持相對(duì)路徑,格式如 trackant(蟻跡尋
蹤)所寫(xiě): .代表當(dāng)前目錄,..代表上層目錄。
#error預(yù)處理
- #error 預(yù)處理指令的作用是,編譯程序時(shí),只要遇到 #error 就會(huì)生成一個(gè)編譯錯(cuò)誤提 示消息,并停止編譯。
- 其語(yǔ)法格式為:??#error error-message
- 注意,宏串 error-message 不用雙引號(hào)包圍。遇到#error 指令時(shí),錯(cuò)誤信息被顯示,可能同時(shí) 還顯示編譯程序作者預(yù)先定義的其他內(nèi)容。關(guān)于系統(tǒng)所支持的 error-message 信息,請(qǐng)查找 相關(guān)資料
#line處理
- #line 的作用是改變當(dāng)前行數(shù)和文件名稱(chēng),它們是在編譯程序中預(yù)先定義的標(biāo)識(shí)符 命令的基本形式如下:
- #line number["filename"]? ?其中[]內(nèi)的文件名可以省略?#line 30 a.h? 其中,文件名 a.h 可以省略不寫(xiě)。
- 這條指令可以改變當(dāng)前的行號(hào)和文件名,例如上面的這條預(yù)處理指令就可以改變當(dāng)前的行號(hào) 為 30,文件名是 a.h。初看起來(lái)似乎沒(méi)有什么用,不過(guò),他還是有點(diǎn)用的,那就是用在編譯 器的編寫(xiě)中,我們知道編譯器對(duì) C 源碼編譯過(guò)程中會(huì)產(chǎn)生一些中間文件,通過(guò)這條指令, 可以保證文件名是固定的,不會(huì)被這些中間文件代替,有利于進(jìn)行分析。
#pragma
- #pragma 指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的 狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作。#pragma 指令對(duì)每個(gè)編譯器給出了一個(gè)方法, 在保持與 C 和 C ++語(yǔ)言完全兼容的情況下,給出主機(jī)或操作系統(tǒng)專(zhuān)有的特征。依據(jù)定義,編譯 指示是機(jī)器或操作系統(tǒng)專(zhuān)有的,且對(duì)于每個(gè)編譯器都是不同的。
- 其格式一般為: #pragma para? ? ?其中 para 為參數(shù),下面來(lái)看一些常用的參數(shù)。?
#pragma message
- message 參數(shù):Message 參數(shù)是我最喜歡的一個(gè)參數(shù),它能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,這對(duì)于源代碼信息的控制是非常重要的。
- 其使用方法為:? #pragma message(“消息文本”)
- 當(dāng)編譯器遇到這條指令時(shí)就在編譯輸出窗口中將消息文本打印出來(lái)。 當(dāng)我們?cè)诔绦蛑卸x了許多宏來(lái)控制源代碼版本的時(shí)候,我們自己有可能都會(huì)忘記有沒(méi)有 正確的設(shè)置這些宏,此時(shí)我們可以用這條指令在編譯的時(shí)候就進(jìn)行檢查。假設(shè)我們希望判 斷自己有沒(méi)有在源代碼的什么地方定義了_X86 這個(gè)宏可以用下面的方法?
?
?
?
內(nèi)存對(duì)齊
- ?利用#pragma pack()來(lái)改變編譯器的默認(rèn)對(duì)齊方式
- 使用指令#pragma pack (n),編譯器將按照 n 個(gè)字節(jié)對(duì)齊。
- 使用指令#pragma pack (),編譯器將取消自定義字節(jié)對(duì)齊方式。 在#pragma pack (n)和#pragma pack ()之間的代碼按 n 個(gè)字節(jié)對(duì)齊。
- 但是,成員對(duì)齊有一個(gè)重要的條件,即每個(gè)成員按自己的方式對(duì)齊.也就是說(shuō)雖然指定了 按 n 字節(jié)對(duì)齊,但并不是所有的成員都是以 n 字節(jié)對(duì)齊。其對(duì)齊的規(guī)則是,每個(gè)成員按其類(lèi)型 的對(duì)齊參數(shù)(通常是這個(gè)類(lèi)型的大小)和指定對(duì)齊參數(shù)(這里是 n 字節(jié))中較小的一個(gè)對(duì)齊,即: min( n, sizeof( item )) 。并且結(jié)構(gòu)的長(zhǎng)度必須為所用過(guò)的所有對(duì)齊參數(shù)的整數(shù)倍,不夠就補(bǔ)空 字節(jié)。
- 注意事項(xiàng)?
#?
- ?在字符串中包含宏參數(shù),那我們就可以使用“#”,它可以把語(yǔ)言符號(hào)轉(zhuǎn) 化為字符串
##運(yùn)算符
- 和#運(yùn)算符一樣,##運(yùn)算符可以用于宏函數(shù)的替換部分。這個(gè)運(yùn)算符把兩個(gè)語(yǔ)言符號(hào)組合成單個(gè)語(yǔ)言符號(hào)?
總結(jié)
以上是生活随笔為你收集整理的C语言深度剖析书籍学习记录 第三章 预处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 全局 窗口,miui12
- 下一篇: STL源码剖析 序列式容器 deque双