关于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);//报错
  
}    

 

 

 

posted @ 2020-04-22 18:15  [呲溜]  阅读(267)  评论(0编辑  收藏  举报