如果有特別去了解過這是什麼東西的話大概就知道它的本質是文本替換,也就是說在你編譯你的c++之前,它會自動根據你的巨集內容,換掉你的程式碼。它會持續這個過程,直到沒有東西可以換為止,聽起來很簡單對吧?
事實上如果自己用的話其實也不算難,例如:
#include <iostream>
#define HELLO_WORLD std::cout<<"Hello World!\n"
int main(){
HELLO_WORLD;
return 0;
}
這樣去編譯,就會在編譯前把最上面那行直接替換成「輸出Hello World!」的程式碼(當然如果你直接用滑鼠執行這個編譯完的exe它會輸出完馬上離開,很可能什麼都看不到,除非你用命令提示字元執行)
巨集除了直接替換字串之外,也可以拿來寫一點簡單的程式,例如:
#define EAT(x) eat_##x##_apples
#define STR(x) #x
#define XSTR(x) STR(x)
這樣以來如果你打出XSTR(EAT(3)),你程式碼在對應的位置,就會變成"eat_3_apples",之所以要用XSTR,是因為如果直接用STR,第一次代換就會直接變成"EAT(3)"然後就看不到了。
除了這些之外還有一些條件編譯的語法,但都不算太複雜,總而言之巨集算是個好玩又方便的東西
前提是你要搞懂你的c++文本裡面到底有哪些巨集,以及哪些是巨集(還有巨集之間如果有同名的東西好像很容易造成不兼容,例如LMMS跟VST3)
總而言之對於初學者來說,如果拿著某個sdk,照著網路上的教學練習,之後自己想小改看看的時候,這是個很容易搞錯的部分。因為巨集它是編譯前的文本替換,所以有些看起來像是函數但實際上是巨集的東西,如果照著寫程式的方法丟進去會出包。另外它其實不算好除錯,所以不能過於濫用。