c语⾔语法——宏定义及其⾼级⽤法
宏定义
⽆参数宏
#define标识符(⼀般⼤写)替换列表
如:
#define PI 3.14
带参宏
#define标识符(参数1,参数2,…,参数n) //替换列表
如:
#define MAX(a,b) ((a)>(b)?(a):(b))
注意: 宏定义在使⽤时尽量使⽤括号括起。
带参宏可⽤于DEBUG调试
#define MYDEBUG printf("ERROR in: %s, at:%s", __FILE__, __LINE__);printf
带参宏和函数的区别
1.宏替换发⽣在预处理阶段,函数调⽤在程序运⾏期间
2.函数调⽤时会对参数类型进⾏严格的检查,宏替换发⽣在预处理阶段,对带参宏调⽤的参数不做检查(带参宏不安全)
3.函数需要为参数分配空间
4.函数在调⽤时需要为检查传参类型是否⼀致带参,为参数分配空间。相对⽽⾔宏运⾏速度更快
5.如果宏定义替换的代码较长则会影响代码长度,函数不会
宏定义⾼级⽤法
特殊符号#
在带参宏的前⾯加上#可以强制将该参数转化为字符串。
#include <stdio.h>
#define MY_PRINT(a) printf("%s\n", #a);
int main(int argc,char** argv[]){
MY_PRINT(1111);
MY_PRINT("1111");
return0;
}
终端输出结果为:
1111
"1111"
特殊符号##
“##”是⼀种分个连接⽅式,它的作⽤是先分隔,然后再强制连接。
#include <stdio.h>
#define TYPE1(type1, type2) type1 type1##_to_##type2
#define TYPE2(type1, type2) type2 type2##_to_##type1
TYPE1(int,float)(float b){c语言char的用法
return(int)b;
}
int main(int argc,char** argv[]){
printf("%d\n",int_to_float(0.01));
return0;
}
终端输出结果为:0。
宏嵌套中遇到#、##符号则不会展开
宏定义中的do{}while(0)
使⽤do{}while(0)将宏定义括起的原因:
(1)空的宏定义避免waring
(2)存在⼀个独⽴的block,可以⽤来进⾏变量定义,进⾏⽐较复杂的实现(3)如果出现在判断语句过后的宏,可以保证作为⼀个整体来实现
#include <stdio.h>
#define FUNC(x)            \
do{                \
if(NULL == x)  \
return 0;  \
}while(0)          \
int main(int argc,char* arg[]){
char* x =NULL;
FUNC(x);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。