• 解决宏与函数重名

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

    理解: 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;
    }
    
  • 相关阅读:
    C#:如何设置MDI窗体
    asp.net在类库中使用EF 6.0时的相关配置
    asp.net中使用jquery ajax保存富文本的问题
    Asp.net Api中使用OAuth2.0实现“客户端验证”
    NLog在asp.net中的使用
    元素的隐藏特性
    jQuery 使用笔记
    获取标签的所有选择器存放在一个数组
    自己绘制的flex布局思维导图
    js打印三角形
  • 原文地址:https://www.cnblogs.com/cfans1993/p/6404014.html
Copyright © 2020-2023  润新知