zoukankan      html  css  js  c++  java
  • 解决宏与函数重名

    函数在前宏在后的重名能正常工作. 宏在前函数在后就需要给函数名加一个括号
    调用函数时,不管谁在前都需要给函数名加括号

    理解: gcc编译时会把宏展开, 也就是把调用宏的地方全部替换成宏后面的字符串,加上括号后就能起到分隔的作用(即防止被替换),
    比如下面的例子,宏在前,gcc编译前会寻找所有f(),然后把f()替换成printf("..."), 而f()函数因为给函数名加了个括号不匹配f(),所以函数定义成功没有被宏替换,在main函数中调用f()函数也需要加括号防止被宏替换

    #include <stdio.h> 
     
    #define f() printf("macro
    ");
    void (f)(){printf("function
    ");}  //f如果不回括号会报错 
     
    int main(int argc, const char *argv[]){
        f();
        (f)();
        return 0;
    }
    

    宏函数的参数

    涉及优先级的宏函数需要给参数加括号

    #include <stdio.h>
     
    #define multiply(x,y) x*y
    #define multiply2(x,y) (x)*(y)
     
    int main(int argc, const char *argv[]){
        printf("%d
    ",multiply(2+1,2)); //2+1*2
        printf("%d
    ",multiply2(2+1,2)); //(2+1)*2
        return 0;
    }
    

    字符化与连接符

    两个井号的连接符与字符串中的strcat不一样,连接符只是一个宏,用于编译前的替换操作,所以想要把两个字符连接起来需要用strcat而不能用连接符,连接符连接后的对象要么是数值要么是已定义的变量名称才有意义

    #include <stdio.h>
    
    #define STR(X) #X
    #define CONC(X,Y) X##Y
    int main(int argc,char *argv[]){
        printf("#10=%s
    ",STR(10));
        printf("10##11=%d
    ",CONC(10,11));
    
        char *p1="this is a test string";
        printf("%s
    ",CONC(p,1));
        return 0;
    }
    
  • 相关阅读:
    正向代理和反向代理的区别
    response对象和request对象详解
    非controller层获取response和request对象
    Java中的Lock与synchronized
    如何解决jeecgBoot前端运行项目之后无法获取验证码的问题
    怎么定义一个自己的vue组件
    前端集成方案——理论(二)
    javascript基础-ajax
    网页中文乱码
    javascript基础-事件2
  • 原文地址:https://www.cnblogs.com/cfans1993/p/6404014.html
Copyright © 2011-2022 走看看