- 相關(guān)推薦
C語(yǔ)言的預處理代碼
導語(yǔ):預處理是程序在被編譯器編譯以前,由預處理器預先進(jìn)行的處理。預處理代碼含有“#”作為符號標志,以區分其他源代碼。下面是C語(yǔ)言的預處理代碼,一起來(lái)學(xué)習下吧:
1.#include 頭文件
其實(shí)就是把 頭文件的內容 全部替換到 當前#include處。
關(guān)于頭文件的好處、來(lái)源、用法可以參考http://blog.csdn.net/pashanhuxp/article/details/39927913一文
補充:
、.#include 和 #include “XXX.h” 的區別:
表示在編譯器定義的引用目錄查找.h頭文件;
“XX” 表示先在項目當前目錄查找.h頭文件,若沒(méi)有再去編譯器指定的目錄查找;
所以,若引用自定義的.h頭文件,只能用#include “XX”。
、.在Eclipse CDT下,#include "XX.h" 指引用usr/include 目錄下的頭文件,并不包括子文件夾的頭文件,若引用子文件夾下的頭文件,需要改為#include “XX/XX.h”
2.#define 宏定義:
宏定義也可以稱(chēng)作“宏替換”,宏會(huì )在編譯之前被預處理程序替換掉。通常用大寫(xiě)表示
宏定義可以增加程序的可讀性和可維護性,比如 #define PI 3.14159
并且宏替換函數,可以提高運行效率,減少函數調用造成的系統開(kāi)銷(xiāo)。比如 #define sum(a,b,c) (a+b+c) 比定義一個(gè)求和函數int sum(a,b,c)要節省內存,提高效率。這里需要注意替換的意思,宏是被直接替換的,比如 #define AA a-b 若不加括號,則在使用過(guò)程中,會(huì )出現cc*AA 變成 cc*a-b 的錯誤。
關(guān)于空的宏定義的補充:
、倏盏暮甓x修飾函數:#define SUM
代碼中有時(shí)會(huì )出現 #define SUM 并沒(méi)給宏SUM “賦值” 。這時(shí)可以將sum 理解成空的,無(wú)意義的。
比如用來(lái)修飾函數: SUM int getSum(a,b) 這時(shí)可以將SUM的作用理解為對函數作用進(jìn)行 簡(jiǎn)單的描述 ,使調用者更明白
、诳盏暮甓x常見(jiàn)于頭文件中,防止頭文件的內容被重復包含。(平時(shí):最好養成這種寫(xiě)頭文件的習慣)
#ifndef _8_4_2_H_
#define _8_4_2_H_
...頭文件內容...
#endif /* 8_4_2_H_ */
這時(shí) _8_4_2_H_ 宏就是一個(gè)空宏,用于條件編譯,有時(shí)常見(jiàn)于防止頭文件重復包含的用途中。給你舉個(gè)例子,再順便分析一下:假設你的工程里面有4個(gè)文件,分別是a.cpp,b.h,c.h,d.h。a.cpp的頭部是:#include "b.h "#include "c.h "b.h和c.h的頭部都是:#include "d.h "而d.h里面有class D的定義。這樣一來(lái),編譯器編譯a.cpp的時(shí)候,先根據#include "b.h "去編譯b.h這個(gè)問(wèn)題,再根據b.h里面的#include "d.h ",去編譯d.h的這個(gè)文件,這樣就把d.h里面的class D編譯了;然后再根據a.cpp的第二句#include "c.h ",去編譯c.h,最終還是會(huì )找到的d.h里面的class D,但是class D之前已經(jīng)編譯過(guò)了,所以就會(huì )報重定義錯誤。
如果在d.h中加上
ifndef _D_H
define _D_H
.......頭文件內容......比如定義class D
endif
就可以防止這種重定義錯誤。
、叟c條件編譯結合:
#ifdefine WINDOWS
....針對windows的相關(guān)處理...
#endif
#ifdefine LINUX
...針對LINUX的相關(guān)操作.....
#endif
則,通過(guò)#define WINDOWS 或者 #define LINUX,可以實(shí)現多系統下編程。
、#define后只有一個(gè)函數,等價(jià)空函數:#define FUNCTION(args)
在頭文件中見(jiàn)到過(guò)這種情況,FUNCTION(args) 函數在這里define為空,則等價(jià)空函數實(shí)際不會(huì )進(jìn)行任何處理。
通常,在這個(gè)頭文件中,還其他已賦值的這個(gè)語(yǔ)句 #define FUNCTION(args) (args*5)
使用舉例:
#ifdefine WIN
#define FUNCTION(args) (args*5)
#else
#define FUNCTION(args)
#endif
如果define了WIN 則FUNCTION(args) 會(huì )進(jìn)行一些具體的操作,否則,FUNTION(args)并不會(huì )執行任何處理。
這樣定義,方便了調用者,即我在調用的時(shí)候,不需要花費代碼去判斷是不是define了WIN,我都可以在我的代碼里直接使用FUNCTION(args)。定義了,則會(huì )對參數進(jìn)行處理,而沒(méi)有定義的話(huà),不會(huì )對參數進(jìn)行改變。
、葸有一些編譯器預定義宏,格式是“雙下劃線(xiàn)開(kāi)頭”。主要標識一些編譯環(huán)境信息。比較少用到。
3.#條件編譯
使用條件編譯時(shí),會(huì )判斷是否編譯器編譯當前的代碼段。提高編譯效率。
#ifdef 條件
代碼段。。。
#endif
解釋?zhuān)喝艉甓x了條件,則執行代碼段,否則不執行。
#if 條件
代碼段。。。
#endif
解釋?zhuān)喝魲l件為真,則執行代碼段,否則不執行。
使用舉例:
#if 0
A
#endif
實(shí)際本代碼中A從不執行,這樣寫(xiě)是為了方便以后調試更改,若想執行A,則只改為 #if 1即可。
4.#宏和函數的區別
(1)看一個(gè)例子,比較兩個(gè)數或者表達式大小,首先我們把它寫(xiě)成宏定義:
#define MAX( a, b) ( (a) > (b) (a) : (b) )
其次,把它用函數來(lái)實(shí)現:
int max( int a, int b)
{ return (a > b a : b) }
很顯然,我們不會(huì )選擇用函數來(lái)完成這個(gè)任務(wù),原因有兩個(gè):
首先,函數調用會(huì )帶來(lái)額外的開(kāi)銷(xiāo),它需要開(kāi)辟一片?臻g,記錄返回地址,將形參壓棧,從函數返回還要釋放堆棧。這種開(kāi)銷(xiāo)不僅會(huì )降低代碼效率,
而且代碼量也會(huì )大大增加,而使用宏定義則在代碼規模和速度方面都比函數更勝一籌;
其次,函數的參數必須被聲明為一種特定的類(lèi)型,所以它只能在類(lèi)型合適的表達式上使用,我們如果要比較兩個(gè)浮點(diǎn)型的大小,就不得不再寫(xiě)一個(gè)專(zhuān)門(mén)針對浮點(diǎn)型的比較函數。反之,上面的那個(gè)宏定義可以用于整形、長(cháng)整形、單浮點(diǎn)型、雙浮點(diǎn)型以及其他任何可以用“>”操作符比較值大小的類(lèi)型,也就是說(shuō),宏是與類(lèi)型無(wú)關(guān)的。
(2)和使用函數相比,使用宏的不利之處在于每次使用宏時(shí),一份宏定義代碼的拷貝都會(huì )插入到程序中。除非宏非常短,否則使用宏會(huì )大幅度增加程序的長(cháng)度。
(3)還有一些任務(wù)根本無(wú)法用函數實(shí)現,但是用宏定義卻很好實(shí)現。比如參數類(lèi)型沒(méi)法作為參數傳遞給函數,但是可以把參數類(lèi)型傳遞給帶參的宏。
看下面的例子:
#define MALLOC(n, type) /
( (type *) malloc((n)* sizeof(type))) // “/”為強制換行符,表示下一行其實(shí)是在上一行的。
利用這個(gè)宏,我們就可以為任何類(lèi)型分配一段我們指定的空間大小,并返回指向這段空間的指針。我們可以觀(guān)察一下這個(gè)宏確切的工作過(guò)程:
int *ptr;
ptr = MALLOC ( 5, int );
將這宏展開(kāi)以后的結果:
ptr = (int *) malloc ( (5) * sizeof(int) ); // 記住#define其實(shí)就是一個(gè)“宏替換”
這個(gè)例子是宏定義的經(jīng)典應用之一,完成了函數不能完成的功能,但是宏定義也不能濫用,通常,如果相同的代碼需要出現在程序的幾個(gè)地方,更好的
方法是把它實(shí)現為一個(gè)函數。
【C語(yǔ)言的預處理代碼】相關(guān)文章:
C語(yǔ)言的預處理08-02
有趣的C語(yǔ)言預處理07-29
C語(yǔ)言預處理知識06-13
c語(yǔ)言編譯預處理10-15
C語(yǔ)言預處理概述09-30
C語(yǔ)言精簡(jiǎn)代碼10-03
最新C語(yǔ)言預處理命令總結09-10
C語(yǔ)言快速排序實(shí)例代碼10-30