預處理器
預處理器在編譯器之前根據(jù)指令更改程序文本。編譯器看到的是預處理器修改過的代碼文本(稱作“翻譯單元(translation unit)”)。
預處理器的三大功能:
1。頭文件或源文件包含;
2。宏擴展;
3。條件編譯;
頭文件包含:
#include <stdio.h> //編譯器首先到標準頭文件庫查找;
#include “myHead.h” //編譯器首先到當前目錄下查找,如找不到再到標準頭文件庫查找;
預處理指令:
#include #define #undef #if #elif #else #endif #ifdef #ifndef #error #line #pragma
宏定義:
用#define定義一個宏;用#undef刪除一個宏;
宏的分類:
無參數(shù)宏(類對象宏)
例:
#define MAXLINES 500
類對象宏類似常數(shù),因此可以用下面語句代替,并且推薦用下面語句來定義。
Const int MAXLINES = 500;
帶參數(shù)宏(類函數(shù)宏)
例:
#define abs(x) ( (x) > 0 ? (x) : (- (x) ) )
//參數(shù)最好用括號封裝,這樣在替換時不會產(chǎn)生歧義
類函數(shù)宏大多可以用內(nèi)聯(lián)函數(shù)來代替,并且推薦。
inline int abs(int x)
{
return x > 0 ? x : (-x);
}
預定義宏:
__LINE__ __FILE__ __DATE__ __TIME__ __cplusplus
例:
// sysmac.cpp
#include <iostram>
using namespace std;
main()
{
Cout << “__DATE__ == “ << __DATE__ << endl;
Cout << “__TIME__ == “ << __TIME__ << endl;
Cout << “__LINE__ == “ << __LINE__ << endl;
Cout << “__FILE__ == “ << __FILE__ << endl;
}
//輸出:
__DATE__ == Nov 28 1996
__TIME__ == 09:37:38
__LINE__ == 7
__FILE__ == sysmac.cpp
預處理運算符:
# ## Defined
# 字符串化;## 加標記;
具體看下面的例子:
#include <stdio.h>
#define trace(x,format) printf(#x “= %” #format “\n” , x)
#define trace2(i) trace(x ## i , d)
main()
{
int i = 1;
float x = 2.0;
char *s = “three”;
trace(i,d); //printf( “x” “=%” “d” “\n” , x)
trace(x,f);
trace(s,s);
Int x1=1,x2=2,x3=3;
trace2(1); //trace(x1,d)
trace2(2);
trace2(3);
}
//輸出:
i = 1
x = 2.000000
s = three
x1 = 1
x2 = 2
x3 = 3