zoukankan      html  css  js  c++  java
  • 关于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);//报错
      
    }    
     
  • 相关阅读:
    IDEA启动报错 NoClassDefFound
    IDEA手动导入jar包到maven本地库
    springboot FilterRegistrationBean 拦截器的使用
    springboot多模块controller访问的问题
    @Slf4j -- lombok.extern.slf4j.Slf4j;
    @mapper注解
    lombok
    Lodop打印小票
    spring security登录认证流程解析
    使用selenium实现简单网络爬虫抓取MM图片
  • 原文地址:https://www.cnblogs.com/prprpr/p/12753690.html
Copyright © 2011-2022 走看看