C语言中用宏动态命名变量名及函数名以及宏字符 # 和 ## 的解释

宏 # 和 ## 的解释
1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。
2 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
3.关于记号粘贴操作符(token paste operator): ## 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
4.其他相关 -- 单独的一个 # : 至于单独一个#,则表示对这个变量替换后,再加双引号引起来。
5.#(stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 

用宏动态命名变量名及函数名的例子:

    #include <stdio.h>
    #include <stdarg.h>

    /**************** .H **********************/
    //#define DVM_MODULE FLWMGR

    /* Create variable name */
    #define CONNECTION(uiPrt, DVM_MODULE) uiPrt##DVM_MODULE
    #define NAME_CAT(uiPrt, DVM_MODULE) CONNECTION(uiPrt, DVM_MODULE)

    int NAME_CAT(uiPrt, DVM_MODULE) = (1<<2);

    /* create function name*/
    #define DVM_PRINT_REGISTER(TRACE_STRING, NUM) \
        inline void _##TRACE_STRING (const char* p, ...); \
        void _##TRACE_STRING (const char* p, ...) \
        { \
            va_list args; \
            if ((NAME_CAT(uiPrt, DVM_MODULE)) & (1 << NUM)) \
            { \
                va_start(args, p); \
                vprintf( p, args ); \
                va_end(args);\
            } \
        }


    /**************** .C ***************/

    DVM_PRINT_REGISTER(FLWMGR_TRACE, 2)

    void main()
    {
        _FLWMGR_TRACE("oooooooo %d %s\n", 5 , "fdsafd");
    }

下面是另一个例子:

    #define CONNECTION(text1,text2) text1##text2
    #define CONNECT(text1,text2) CONNECTION(text1,text2)

        int CONNECT(test,1212) = 1212; // int test1212 = 1212;

    #define VAR 326
        int CONNECT(test,VAR) = 326; // int test326 = 326;
    #undef VAR

    #define VAR 86
        int CONNECT(test,VAR) = 86; // int test86 = 86;
    #undef VAR

       int CONNECT(test,__LINE__) = __LINE__; // int testXXX = XXX;


    为了方便的自动命名,出现第3个宏
    #define CONNECT_BY_LINE(text) CONNECT(text,__LINE__)

       int CONNECT_BY_LINE(test) = __LINE__; // int testYYY = YYY;


    简化版本如下:
    #include <stdio.h>

    #define SET_NAME(name) SET_NAME_2(name)
    //#define SET_NAME_1(name) SET_NAME_2(name)
    #define SET_NAME_2(name) test##name

    int main()
    {
        int SET_NAME(1212) = 1212;
    #define VAR 326
        int SET_NAME(VAR) = 326;
    #undef VAR
    #define VAR 86
        int SET_NAME(VAR) = 86;
    #undef VAR
        printf("%d %d %d\n",test1212,test326,test86);
        return 0;
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值