• C语言宏定义中的#和##的作用【转】


    本文转载自:http://my.oschina.net/shelllife/blog/123202

    在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化为字符串。

    1.   #: 在宏定义中,将其后的变量,转化为字符串。

        eg:  #define  str(s)      #s

      输出: helloworld , 就可以通过这样的的调用, printf( str(helloworld) );

    2. ## : 在宏定义中,将其前后的两个变量拼接在一起。

         eg: #define v(a,b,c,d)       0xa##b##c##d             

         //将四个字节的十六进制的数据转化为一个十六进制的整型数据

        int    a  =  v(CF,AB,B0,BC);   // 即 a = 0xCFABB0BC

    3. 两者的共性: 能够阻止宏定义的递归展开。可以通过中间的转换的宏,来实现参数宏的展开。

    测试例子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define ROOT "/mnt/sd/"
    #define NAME "kernel.img"
    
    #define path(dir,name) dir##name
    #define print(format,args...) printf(format,##args)
    #define test(name) #name
    
    enum
    {
        MON = 1,
        TUE = 2,
        SUN = 7
    };
    
    int main(int argc, char *argv[])
    {
        //printf("macro PATH = %s
    ", PATH);
        //printf("path(dir,name) = %s
    ", path(ROOT,NAME));
        printf("path(dir,name) = %s
    ", path(RO,OT));
    
        //printf("macro TEST = %s
    ", TEST);
        printf("test(name) = %s
    ", test(NAME));
        printf("test(MON) = %s
    ", test(MON));
        //printf("#MON = %s
    ", #MON);
    
        print("%s%s
    ", ROOT,NAME);
    
        return 0;
    }
  • 相关阅读:
    转 sql 时间转换格式 convert(varchar(10),字段名,转换格式)
    C#页面添加提交数据后跳出小弹窗的功能
    解决粘包问题
    粘包问题
    模拟ssh远程执行命令
    基于TCP协议的socket套接字编程
    Linux和git使用
    osi七层协议
    TCP协议的三次握手和四次挥手
    C/S 和 B/S架构
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/5788236.html
Copyright © 2020-2023  润新知