官术网_书友最值得收藏!

2.11 預處理器

C++預處理器(也叫預編譯器)提供了一些預處理命令,如#define、#else、#elif、#endif、#error、#if、#ifdef、#ifndef、#include、#line、#pragma、#undef等。這些命令在正式編譯之前執行,所有的預處理命令都以“#”開頭,獨占一行,語句結束時不需要分號。

1.#define和#undef

#define常用于定義一個標識符常量或帶參數的宏。例如:

#define pi 3.14159
#define MAX(a,b) ((a)>(b)?(a):(b))

在對程序進行預編譯時,C++會用#define定義的標識符常量的值替代常量標識符,用宏的代碼替代宏名。例如,若對上述定義存在下面的引用:

x=pi+5;
int y=MAX(9,3);

在編譯相應程序之前,上面的兩條語句將被預處理為下面的形式:

x=3.14159+5;
int y=((9))>(3)?(9):(3));

#undef用于刪除由#define定義的宏,使之不再起作用。例如:

#undef MAX

此命令之后,MAX就不再有意義了。

2.條件編譯

條件編譯指示編譯器只對滿足條件的語句或語句塊進行編譯,使同一程序在不同的編譯條件下,能夠得到不同的目標代碼。常用的條件編譯有以下兩種形式。

(1)第1種形式

#ifdef 標識符
  語句組1
[#else
   語句組2
]
#endif

[ ]中的內容是可選項,即可以有#else部分,也可以沒有#else部分。意思是,如果已經用#define定義了某標識符,就編譯語句組1;否則就編譯語句組2,當然前提是存在#else部分。

(2)第2種形式

#ifndef 標識符
   語句組1
[#else
   語句組2
]
#endif

如果沒有用#define定義某標識符,就編譯語句組1;否則就編譯語句組2。

例2-19】 #ifdef條件編譯的應用例子。

//Eg2-19.cpp
#include <iostream>
using namespace std;
#define DK
#ifdef DK
   void f1(){ cout<<"Dk is defined!"<<endl; }
#else
   void f1(){ cout<<"DK not defined!"<<endl; }
#endif
void main(){
   f1();
}

由于“#ifdef DK”為真,所以本程序相當于下面的程序:

#include <iostream>
using namespace std;
void f1(){ cout<<"Dk is defined!"<<endl; }
void main(){
   f1();
}

請大家思考一下,如果去掉語句“#define DK”,又會是什么情況呢?

主站蜘蛛池模板: 上犹县| 南和县| 车险| 马公市| 始兴县| 敖汉旗| 安阳市| 天峨县| 和田县| 共和县| 博野县| 东明县| 博湖县| 奇台县| 特克斯县| 逊克县| 江阴市| 永定县| 通渭县| 岳阳市| 长沙县| 平武县| 浦北县| 乌兰察布市| 焉耆| 台中县| 塔河县| 定结县| 壤塘县| 天台县| 迁西县| 吉首市| 巴马| 苗栗市| 富裕县| 冕宁县| 凉山| 普格县| 台中市| 如皋市| 宁国市|