宏定义&宏函数(日志输出)define
最常见的就是
#indef __cplusplus
这表示支持C++语法
再如可以定义常量
#define MAX 100
这跟JAVA全局变量有什么区别呢?
JAVA的变量是有类型的,这没有类型,这只是替换而以!
还有就是宏函数,就是就是当函数名太长时,可以简写而以!
void cat_read(){
printf("%s\n","input something");
}
#define jni(NAME) cat_##NAME();
void main(){
jni(read);
system("pause");
}
上面就是将cat_read这个方法函数,变成了 jni(read)来调用!很简单哇-
举个日志输出的例子
#define LOG(FORMAT,...) printf(##FORMAT,__VA_ARGS__);
void main(){
LOG("%s","123");
system("pause");
}
定义了一个LOG函数,其实...表示不确定后面有几个参数,也许1个,也许多个,与后面的__VA_ARGS__对应,这表示可变参数,这是固定写法
第一个参数 FORMAT,并不是固定写法,可以替换成任意字符串,比如NAME
再比如,日志会有级别,比如I级,这里可以这样写
#define LOG_I(FORMAT,...) printf("INFO:");printf(##FORMAT,__VA_ARGS__);
void main(){
LOG_I("%s", "123");
system("pause");
}
最终就会输出:INFO:123
说穿了就是替换。在程序的预编译期完成替换工作。
再来个升级的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");
}
相当于第二个LOG_I的定义,又引用了第一个定义,相当于替换了两次