本來(lái)只是預(yù)處想了解一下#ifdef,#ifndef,#endif的,沒(méi)想到查出來(lái)這么多的理指令預(yù)處理指令,上面的預(yù)處多數(shù)都是常見(jiàn)的,但是理指令平時(shí)沒(méi)有怎么注意預(yù)處理這方面的內(nèi)容,所以這里梳理一下知識(shí)吧。預(yù)處同時(shí)有什么不妥的理指令地方,或者遺漏了什么內(nèi)容,預(yù)處還請(qǐng)留言指出。理指令
預(yù)處理指令是預(yù)處以#號(hào)開(kāi)頭的代碼行。#號(hào)必須是理指令該行除了任何空白字符外的第一個(gè)字符。#后是預(yù)處指令關(guān)鍵字,在關(guān)鍵字和#號(hào)之間允許存在任意個(gè)數(shù)的理指令空白字符。整行語(yǔ)句構(gòu)成了一條預(yù)處理指令,預(yù)處該指令將在編譯器進(jìn)行編譯之前對(duì)源代碼做某些轉(zhuǎn)換。理指令
以前沒(méi)有在意的預(yù)處學(xué)者注意了,預(yù)處理指令是在編譯器進(jìn)行編譯之前進(jìn)行的操作.預(yù)處理過(guò)程掃描源代碼,對(duì)其進(jìn)行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器。可見(jiàn)預(yù)處理過(guò)程先于編譯器對(duì)源代碼進(jìn)行處理。在很多編程語(yǔ)言中,并沒(méi)有任何內(nèi)在的機(jī)制來(lái)完成如下一些功能:在編譯時(shí)包含其他源文件、定義宏、根據(jù)條件決定編譯時(shí)是否包含某些代碼(防止重復(fù)包含某些文件)。要完成這些工作,就需要使用預(yù)處理程序。盡管在目前絕大多數(shù)編譯器都包含了預(yù)處理程序,但通常認(rèn)為它們是獨(dú)立于編譯器的。預(yù)處理過(guò)程讀入源代碼,檢查包含預(yù)處理指令的語(yǔ)句和宏定義,并對(duì)源代碼進(jìn)行響應(yīng)的轉(zhuǎn)換。預(yù)處理過(guò)程還會(huì)刪除程序中的注釋和多余的空白字符。
這個(gè)預(yù)處理指令,我想是見(jiàn)得最多的一個(gè),簡(jiǎn)單說(shuō)一下,第一種方法是用尖括號(hào)把頭文件括起來(lái)。這種格式告訴預(yù)處理程序在編譯器自帶的或外部庫(kù)的頭文件中搜索被包含的頭文件。第二種方法是用雙引號(hào)把頭文件括起來(lái)。這種格式告訴預(yù)處理程序在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應(yīng)用程序是在它們自己的私有子目錄下的。一個(gè)應(yīng)用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區(qū)別出一組公共的頭文件。
有關(guān)#define這個(gè)宏定義,在C語(yǔ)言中使用的很多,因?yàn)?define存在一些不足,C++強(qiáng)調(diào)使用const來(lái)定義常量。宏定義了一個(gè)代表特定內(nèi)容的標(biāo)識(shí)符。預(yù)處理過(guò)程會(huì)把源代碼中出現(xiàn)的宏標(biāo)識(shí)符替換成宏定義時(shí)的值。記住僅僅是進(jìn)行標(biāo)識(shí)符的替換。下面列舉一些#define的使用:
* (1)三元運(yùn)算符要比if,else效率高 * (2)宏的使用一定要細(xì)心,需要把參數(shù)小心的用括號(hào)括起來(lái), * 因?yàn)楹曛皇呛?jiǎn)單的文本替換,不注意,容易引起歧義錯(cuò)誤。
*首先說(shuō)明,這個(gè)宏的定義是錯(cuò)誤的。并沒(méi)有實(shí)現(xiàn)程序中的B+2的平方 * 預(yù)處理的時(shí)候,替換成如下的結(jié)果:b+2*b+2 * 正確的宏定義應(yīng)該是:#define SQR(x) ((x)*(x)) * 所以,盡量使用小括號(hào),將參數(shù)括起來(lái)。
(絕大多數(shù)是使用不到這些的,使用到的話,查看手冊(cè)就可以了) * 第一個(gè)宏,用#把參數(shù)轉(zhuǎn)化為一個(gè)字符串 * 第二個(gè)宏,用##把2個(gè)宏參數(shù)粘合在一起,及aeb,2e3也就是2000
WORD_HI(xxx) ((byte)((word)(xxx) 8))
* 一個(gè)字2個(gè)字節(jié),獲得低字節(jié)(低8位),與255(0000,0000,1111,1111)按位相與 * 獲得高字節(jié)(高8位),右移8位即可。
關(guān)于#define宏的使用,應(yīng)該特別小心,尤其是含有參數(shù)計(jì)算的時(shí)候如小2示例,最保險(xiǎn)的做法將參數(shù)用括號(hào)括起來(lái)。
預(yù)處理就是在進(jìn)行編譯的第一遍詞法掃描和語(yǔ)法分析之前所作的工作。說(shuō)白了,就是對(duì)源文件進(jìn)行編譯前,先對(duì)預(yù)處理部分進(jìn)行處理,然后對(duì)處理后的代碼進(jìn)行編譯。這樣做的好處是,經(jīng)過(guò)處理后的代碼,將會(huì)變的很精短。