【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\n",h(f(1,2)));
 printf("%s\n",g(f(1,2)));
 printf("%s\n",k(m));
 return 0;
}

    输出为:

12

12

m

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

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

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

 


THE END!

posted @ 2018-09-17 19:45  SoaringLee_fighting  阅读(2871)  评论(0编辑  收藏  举报