最常見的就是
#indef __cplusplus
這表示支持C++語法
再如可以定義常量
#define MAX 100?
這跟JAVA全局變量有什么區(qū)別呢?
JAVA的變量是有類型的,這沒有類型,這只是替換而以!
還有就是宏函數(shù),就是就是當(dāng)函數(shù)名太長時(shí),可以簡寫而以!
void cat_read(){
? ?printf("%s\n","input something");
}
#define jni(NAME) cat_##NAME();
void main(){
? ?jni(read);
? ?system("pause");
}
上面就是將cat_read這個(gè)方法函數(shù),變成了 jni(read)來調(diào)用!很簡單哇-
舉個(gè)日志輸出的例子
#define LOG(FORMAT,...) printf(##FORMAT,__VA_ARGS__);
void main(){
? ?LOG("%s","123");
? ?system("pause");
}
定義了一個(gè)LOG函數(shù),其實(shí)...表示不確定后面有幾個(gè)參數(shù),也許1個(gè),也許多個(gè),與后面的__VA_ARGS__對應(yīng),這表示可變參數(shù),這是固定寫法
第一個(gè)參數(shù) FORMAT,并不是固定寫法,可以替換成任意字符串,比如NAME
再比如,日志會有級別,比如I級,這里可以這樣寫
#define LOG_I(FORMAT,...) printf("INFO:");printf(##FORMAT,__VA_ARGS__);
void main(){
? ?LOG_I("%s", "123");
? ?system("pause");
}
最終就會輸出:INFO:123
說穿了就是替換。在程序的預(yù)編譯期完成替換工作。
再來個(gè)升級的LOG寫法
#define LOG(LEVEL,FORMAT,...) printf(##LEVEL); printf(##FORMAT,__VA_ARGS__);
#define LOG_I(FORMAT,...) LOG("INFO:",##FORMAT,__VA_ARGS__);
void main(){
? ?LOG_I("%s", "123");
system("pause");
}
相當(dāng)于第二個(gè)LOG_I的定義,又引用了第一個(gè)定義,相當(dāng)于替換了兩次