--- title: 宏定義 tags: cpp_dev --- <a href="https://gcc.gnu.org/onlinedocs/cpp/Macros.html">參考</a> ## 宏定義 gcc編譯過程一般分為四個階段 ```graphviz digraph ER{ {rank=same;預處理,編譯,組合語言,連接} 預處理->編譯; 編譯->組合語言; 組合語言->連接; } ``` **宏定義**在預處理階段就會被展開 然後因為**預處理器**並不認識c預留關鍵字 所以絕大部分合法的標識符都可以被定義為宏 比如,我們可以重定義const的含義 > 只有define關鍵字和c++命名操作符不能被重定義。 **宏定義**主要有三種用途: 1. **引入文件** 想必這東西大家都很常見 對,就是`#include<bits/stdc++.h>` 2. **條件編譯** 預處理器根據`#if`或`#ifdef`等編譯命令的條件 將部分程式碼引入或排除,這在Debug上也很好用 3. **宏展開** 將宏的引用展開成對應的宏定義,即等等說的`#define` 請注意,這個階段只會做代換,不會運算 待會會展示實際的例子 ## 對象形式的宏定義 > #define OBJECT_MACRO macro-body #define命令是C語言中的一個宏定義命令 它用來將一個標識符定義為一個字符串 該標識符被稱為==宏名==,而被定義的字符串稱為==替換文本==。 這是各位最常見的範例: ```cpp #define ll long long // 將long long 重定義為 ll // 如此,就不用打太多字 using ll = long long; // 然而,在C++11 過後,官方倡導用using 來重定義 ``` 再來是宏展開的代換問題: ```cpp #define num 1+2 cout << num*2 << endl; // 輸出:5 ,因為宏定義只做代換,不做運算 // 即:cout << 1+2*2 << endl; #define num (1+2) // 用上面的方式才能輸出正確的答案:6 ```