C++前處理器
阿新 • • 發佈:2018-12-19
前處理器是一些指令,指示編譯器在實際編譯之前所需完成的處理。
#define
define用於定義巨集。巨集是一個程式碼級的文字替換,因為替換髮生在編譯之前。
神奇的例子,來猜猜輸出結果。
#define STR(s) #s //# 會給 s 加上雙引號 "s" #define CONCAT(x, y) x##y //## 是將x和y拼接在一起 #define X(a) a //帶引數的巨集 //main函式中 cout << STR(hello world) << endl; cout << "CONCAT(1, 2) = " << CONCAT(1, 2) << endl; CONCAT(in, t) i = 1; cout << "i = " << i << ", type: " << typeid(i).name() << endl; X(double) j = 3.14; cout << "j = " << j << ", type: " << typeid(j).name() << endl;
輸出:
hello world
CONCAT(1, 2) = 12
i = 1, type: int
j = 3.14, type: double
很有用的C++巨集
這些巨集對於列印錯誤日誌很有用,可以定位到某個文字,某行,甚至程式的編譯日期。
巨集 | 描述 |
---|---|
LINE | 當前行 |
FILE | 當前檔名 |
DATA | 程式編譯日期 |
TIME | 程式編譯時間 |
條件編譯
簡述了,確實要有點基礎才能懂。不過沒關係,後邊有例子。
指令 | 描述 |
---|---|
#ifdef XXX | 如果定義了巨集XXX |
#ifndef XXX | 如果沒有定義巨集XXX |
#if XXX | 如果表示式XXX為真 |
#elif XXX | 否則,如果表示式XXX為真 |
#else | 否則 |
#endif | 結束標誌 |
如果沒有定義 XXX 這個巨集,程式碼塊有效;否則,程式碼塊無效。
#ifndef XXX
//程式碼塊
#endif
如果(1==1)為真,則程式碼塊1有效,否則程式碼2有效。
#if (1==1)
//程式碼塊1
#else
//程式碼塊2
#endif