詳解預處理器巨集的幾個特徵及其應用

2021-06-01 23:09:34 字數 1353 閱讀 7155

「#」指示:允許使用乙個識別符號並把它轉化為字元陣列

應用例項1:

#include using namespace std;

#define debug(x) cout << #x"=" << x << endl;

int main()

執行結果:

9=9a+1=2

應用例項2,實現跟蹤一條語句的功能:

#include using namespace std;

#define trace(s) cerr<<"語句<"#s">的執行結果: ",s

void f(int i)

int main()

執行結果:

語句的執行結果: i 1

語句的執行結果: i 2

語句的執行結果: i 3

語句的執行結果: i 4

語句的執行結果: i 5

語句的執行結果: i 9

語句的執行結果: hello world!

"##"指示:可以實現標誌貼上,允許兩個識別符號並把它們貼上在一起自動產生乙個新的識別符號

應用例項3:

#define field(a) char* a##_string; int a##_size

class record

;

對於上述**,每次呼叫field巨集將產生乙個儲存字元陣列的識別符號和另乙個儲存字元陣列長度的識別符號,這使得程式易讀並且消除了編碼出錯,使得維護更加容易

應用示例4:

#define a1(name, type)  type name_##type##_type

#define a2(name, type) type name##_##type##_type

a1(a1, int); /* 等價於: int name_int_type; */

a2(a1, int); /* 等價於: int a1_int_type; */

解析:

1) 在第乙個巨集定義中,"name"和第乙個"_"之間,以及第2個"_"和第二個"type"之間沒有被分隔,所以預處理器會把name_##type##_type解釋成3段: 「name_」、「type」、以及「_type」,這中間只有「type」是在巨集前面出現過的,所以它可以被巨集替換。

2) 而在第二個巨集定義中,「name」和第乙個「_」之間也被分隔了,所以預處理器會把name##_##type##_type解釋成4段:「name」、「_」、「type」   以及「_type」,這其間,就有兩個可以被巨集替換了。

預處理器(巨集的用法)

編譯器在對巨集預處理時,會 1.將標頭檔案展開 2.去掉注釋 3.巨集替換 4.條件編譯 巨集替換時應注意的幾點 1 會把它兩邊的字元轉換為乙個字元 2 巨集要替換乙個函式或者引數時,需要加上 3 鄰近字元連線原則 4 value value指代乙個變數名,會將該字面值轉換為乙個字串 value 1...

預處理器之巨集定義

以 開頭的命令都是預處理命令,預處理不是c語言的語句,不能被編譯器編譯。所以在編譯之前需要使用預處理器做檔案的預處理工作。在編譯之前,所有的預處理語句都要被處理 替換或展開 eg1 一般巨集定義 define num 100eg2 有引數的巨集定義 define s a,b a beg3 寫乙個巨集...

預處理器之巨集的使用

我們知道c程式在編譯過程之前,c語言預處理器首先對程式 作了了必要的轉換處理。巨集在c程式中是非常有用的,比如我們可以通過修改巨集定義來修改在程式中出現的所有例項。同時通過巨集定義還可以免去函式呼叫帶來的重大系統開銷。雖然巨集定義非常有用,但是巨集定義也是非常容易出錯的。主要表現為以下幾點 1 不能...