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;
    }
    
  • 相关阅读:
    alt属性和title属性
    穷人和富人的区别
    JS经典源码:通用JavaScript脚本函数库
    网页弹出框
    男女交往必知15个真理
    alexa排名
    好男人找不到女朋友的根源
    小笑话集(全是经典!)不信你不笑(转)
    送到家服务网2009年3月26日顺利上线了!
    [转]互联网产品开发中的“快”字诀
  • 原文地址:https://www.cnblogs.com/cfans1993/p/6404014.html
Copyright © 2011-2022 走看看