c++ 預處理

預處理:編譯之前的處理。
預處理主要的3個方面內容:
(1)宏定義和宏替換
(2)文件包含
(3)條件編譯


宏替換的本質------文本替換
(1)宏名一般大寫,宏名和參數的空格間不能有空格,宏定義末尾不加分號。如: #define BASE 4
(2)宏只做替換,不做語法檢查,不做計算,不做表達式求解

#define FUNC(x)   x*x
int a = 3,b = 4;
FUNC(a+b) = a+b*a+b = 3+4*3+4 = 19;			//可以發現此處是直接做了文本替換,不會做表達式 a+b 的求解
#define FUNC(x) (x)*(x)
int a = 3,b = 4;
FUNC(a+b) = (a+b)*(a+b) = (3+4)*(3+4) = 49;

(3)宏替換在編譯前進行,不分配內存;函數調用在編譯後程序運行時進行,並分配內存
(4)函數只有一個返回值,但是利用宏可以設法得到多個值
(5)宏替換使源程序變長,函數調用不會
(6)宏替換不佔用運行時間,只佔編譯時間,函數調用佔運行時間(分配內存,保留現場,值傳遞,返回值)


文件包含

#include <xxx>:頭文件名在尖括號裏,可以認爲該頭文件是標準頭文件。編譯器會在預定義的位置集合(可以通過設置查找路徑環境變量,或者通過命令行選項修改)中查找該頭文件。
#include "xxx.h":頭文件名在引號裏,那麼它是非系統頭文件,非系統頭文件(自定義的一些文件)的查找通常開始於源文件所在的路徑。


條件編譯

#if/#ifdef/#ifndef
#elif
#else
#endif

文件包含需要考慮 避免多重包含的問題,可以通過條件編譯語句 來避免多重包含。

如下:使用#ifndef判斷 指定的預處理器變量TESTMGR_H 是否 有被定義,如果 預處理器變量沒有被定義,則使用#define去定義,直到出現#endif之間的語句都被處理。可以通過這個方法來解決多次包含同一個頭文件的情況,這樣同一個頭文件只會被引入1次。因爲 通過 #ifndef 判斷該文件已經存在,則不會執行下面的內容。

#ifndef TESTMGR_H
#define TESTMGR_H
// 類的定義與相關函數的定義
#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章