zoukankan      html  css  js  c++  java
  • c语言的#和##的用法

    #include <stdio.h>
    
    #define ADD(A,B) printf(#A " + " #B " = %d
    ",((A)+(B)))
    #define XNAME(n) x ## n
    #define PRINT_XN(n) printf("x" #n " = %d
    ", x ## n)
    
    
    int main(void)
    {
    	ADD(4,5);
    
    	int XNAME(1) = 14;
    	PRINT_XN(1);
    
        return 0;
    }
    

      再次学习一下后两个还定义的小技巧,在vscode中可以把鼠标放到代码中,可以看到宏定义展开的最终结果。这个编辑器,值得推荐,我主打用他来写代码的。

    1、如果A是一个宏形参,那么#A就是转换为字符串"A"的形参名。这个过程称为字符串化(stringizing)

    2、与#运算符类似,##运算符可用于类函数宏(带参宏)的替换部分。##运算符可以把两个记号组合成一个记号。

     

    运行结果:

     ##运算符在这里看来并没有起到多大的便利,反而会让我们感觉到不习惯。但是,使用##运算符有时候是可以提高封装性及程序的可读性的。如跑实时操作系统的stm32程序中,关于gpio的硬件驱动中有如下代码:

    #define __STM32_PIN(index, gpio, gpio_index) 
    {
    index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_PIN_##gpio_index 
    }

     

    假设这样使用该宏:

    __STM32_PIN(7, C, 13)

     

    该宏将展开为:

    {7, GPIOC_CLK_ENABLE, GPIOC, GPIO_PIN_13}
    然后这就可以很方便的将要使用的硬件引脚这么一一列出来,然后再拿去进行配置

     

  • 相关阅读:
    vux 局部注册组件
    vux 全局注册组件
    axios请求本地json
    vux报错 this指针问题
    Vue如何引入远程JS文件
    报错 ERROR in static/js/vendor.b3f56e9e0cd56988d890.js from UglifyJs
    封装axios
    js判断手机型号
    js判断是否在微信浏览器打开
    nginx+tomcat实现负载均衡以及session共享(linux centos7环境)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12044617.html
Copyright © 2011-2022 走看看