zoukankan      html  css  js  c++  java
  • 【C】C语言中宏定义连接符##和转换符#的用法详解

    目录

    1、参考

    2、宏定义中特殊符号的含义


    Date: 2018.9.17


    1、参考

    https://blog.csdn.net/cbnotes/article/details/50388325

    https://blog.csdn.net/gordennizaicunzai/article/details/80473180

    2、宏定义中特殊符号的含义

    1. 宏定义语句连接符 : 在C/C++宏定义中规定,宏定义只允许写在同一行,下一行就不属于这个宏定义了,而实际定义宏过程中,经常会出现较复杂的宏定义,较长,写在一行不易于读懂,需按逻辑关系断行编写,此时需要在行的末尾用连接符“”进行连接,表示上下行属于同一行,即同属于这个宏定义。
    2. 宏定义参数连接符 ##:##主要用于将宏定义中的两个token链接起来,这里的token可以是宏的变量,也可以是任意参数或者标记。
    3. 宏定义符号#: #能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。
    4. 宏定义符号#@:将标记转换为相应的单个字符,注意:仅对单一标记转换有效。例如
       #define B(x) #@x

       则B(a)即’a’,B(1)即’1’.但对B(abc)却不甚有效.

    举例如下:

    
    #include<stdio.h>
    #define f(a,b) a##b
    #define g(a) #a
    #define h(a) g(a)
    #define k(a) #@a
    
    #define test(type) 
        test1(type,1) 
        test1(type,4) 
        test1(type,6) 
        test1(type,8)
    int main()
    {
     printf("%s
    ",h(f(1,2)));
     printf("%s
    ",g(f(1,2)));
     printf("%s
    ",k(m));
     return 0;
    }

        输出为:

    12
    
    12
    
    m

         进一步理解一下这两个宏定义符号的含义:

          ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。

         #符是把传递过来的参数当成字符串进行替代。


    THE END!

  • 相关阅读:
    linux下svn自动启动
    linux下SVN从一台服务器迁移到另一台服务器
    linux下安装subvision
    Activiti 6.0 变化
    Nexus3将本地jar包添加到仓库
    2021年放假安排
    字典词典工具
    测试问题及心得(实时修改添加)
    外网主机远程连接内网主机
    自动化测试
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532370.html
Copyright © 2011-2022 走看看