- C++面向對象程序設計
- 杜茂康等編著
- 562字
- 2019-01-01 05:54:55
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”,又會是什么情況呢?
推薦閱讀
- 數據展現的藝術
- Hadoop 2.x Administration Cookbook
- UTM(統一威脅管理)技術概論
- MCSA Windows Server 2016 Certification Guide:Exam 70-741
- 數據挖掘實用案例分析
- Google App Inventor
- Ceph:Designing and Implementing Scalable Storage Systems
- Moodle Course Design Best Practices
- INSTANT Drools Starter
- 大數據驅動的機械裝備智能運維理論及應用
- PVCBOT機器人控制技術入門
- 大數據案例精析
- JRuby語言實戰技術
- 貫通Hibernate開發
- Cloudera Hadoop大數據平臺實戰指南