关于c语言中宏方法的那些坑
宏定义在c语言中是个十分方便的存在
比如利用公式计算时,可以利用宏方法
但宏也有一些很容易忽视的细节
刚入坑c的程序猿很容易犯错
接下来一起看看吧
#1:宏的末尾加分号
#define PI 3.14 ;
这个错误想必有不少新人犯过,因为宏定义是单纯的文本替换,它会把宏名称的后面的文本复制到换行符停止(这里不考虑换行),
因此"PI"在预处理后会被替换成 "3.14;"后面的分号也会带上
#2:宏方法输出与理想值不一致
#define squ(x) x*x
int main(){
int a = 2;
int b = 3;
printf("%d",squ(a+b));
}
这是个简单的求平方宏,那么它的输出会是25吗?我们来把宏替换进去看看
注意宏是单纯的文本替换
#define squ(x) x*x int main() { int a = 2; int b = 3; printf("%d", 2+3*2+3); }
如上所示,可以看到最终输出为11,这也是新手不容易发现的错误
正确的宏应该这样写
#define squ(x) ((x)*(x))
#3:字符串常量化运算符(#)
利用"#"可以将宏方法的参数变为字符串
例如
#define OUT(x) printf(#x)
注意:这里的参数x不用打括号写成这样 printf(#(x))
并且转化为字符串时会自动加上引号
OUT(123) 等价于 printf("123")
哪怕输入参数不连续也不影响
OUT(1+2 3) 等价于 printf("1+2 3")
对于标记粘贴运算符(##)来说也是一个样
#define OUT(x) printf("123%d",##x) int main(){ OUT(456);//输出:123456 OUT(45 6);//报错 }