技術交流QQ群:1027579432逸绎,歡迎你的加入饮笛!
1.Cpp中的預處理器
- 預處理器是一些指令蹄梢,指示編譯器在實際編譯之前所需完成的預處理稽亏。所有的預處理器指令都是以井號#開頭壶冒,只有空格字符可以出現(xiàn)在預處理指令之前。預處理指令不是C++語句措左,所以它們不會以分號;結(jié)尾依痊。
2.#define預處理
- #define預處理指令用于創(chuàng)建符號常量避除。該符號常量通常稱為宏怎披,指令的一般形式是:
#define 宏名 常量值(replacement-text)
- 當這一行代碼出現(xiàn)在一個文件中時,在該文件中后續(xù)出現(xiàn)的所有宏都將會在程序編譯之前被替換為replacement-text瓶摆。實例如下:
#include "iostream" using namespace std; #define PI 3.14 // 不能有分號!!! int main(){ cout << "PI = " << PI << endl; return 0; }
3.參數(shù)宏
- 可以使用#define來定義一個帶有參數(shù)的宏凉逛,實例如下:
#include "iostream" using namespace std; #define MIN(a, b) (a<b ? a:b) // 帶參數(shù)的宏 int main(){ int i =20, j=39; cout << "MIN(i, j) = " << MIN(i, j) << endl; return 0; }
4.條件編譯
- 有幾個指令可以用來有選擇的對部分程序源代碼進行編譯,這個過程被稱為條件編譯群井。條件預處理器的結(jié)構(gòu)與if選擇結(jié)構(gòu)很像状飞。請看下面這段預處理器的代碼:
#ifdef NULL #define NULL 0 #endif
- 可以只在調(diào)試時進行編譯,調(diào)試開關可以使用一個宏來實現(xiàn)书斜,如下所示:
#ifdef DEBUG cerr << "x = " << x << endl; #endif
- 如果在指令#ifdef DEBUG之前已經(jīng)定義了符號常量DEBUG诬辈,則會對程序中的cerr語句進行編譯。可以使用#if 0語句注釋掉程序的一部分荐吉,如下所示:
#ifdef 0 // 不進行編譯的代碼 #endif
- 完整的實例如下:
#include "iostream" using namespace std; #define DEBUG int main(){ #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* 這是注釋部分 */ cout << MKSTR(HELLO C++) << endl; #endif #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
5.#和##運算符
- #和##預處理運算符在C++和ANSI/ISO C中都是可用的焙糟。#運算符會把replacement-text令牌轉(zhuǎn)換為用引號引起來的字符串。實例如下:
#define MKSTR(x) #x int main(){ cout << MKSTR(Hello C++) << endl; return 0; }
- ##運算符用于連接兩個令牌样屠。下面是一個實例:
#define CONCAT a ## b // 當CONCAT出現(xiàn)在程序中時穿撮,它的參數(shù)會被連接起來,并用來取代宏 int main(){ int xy = 100 cout << CONCAT(x, y) << endl; }
6.C++中的預定義宏
-
C++提供了下表所示的一些預定義宏:
預定義宏.png - 預定義宏實例如下:
int main(){ cout << "__LINE__ = " << __LINE__ << endl; cout << "__FILE = " << __FILE__ << endl; cout << "__DATE = " << __DATE__ << endl; cout << "__TIME = " << __TIME__ << endl; return 0; }