zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    linux防火墙关闭与中文显示乱码排错
    linux基础命令
    盒子模块
    表的数据类型
    pymysql模块
    sql综合练习题
    pymysql内置功能
    数据操作
    vue 左侧菜单展示,以及对应的路由配置
    vue 左侧菜单路由实现
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/5788236.html
Copyright © 2011-2022 走看看