c语言中的#和##

adtxl
2021-11-01 / 0 评论 / 704 阅读 / 正在检测是否收录...

本文主要讲述c语言中#和##的用法

\#的作用----字符串化操作符
将宏定义中的传入参数名转换成一对双引号括起来参数名字符串,其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。

注:

  • 将右边的参数做整体的字符串替换。
  • 对于\#的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
#include<stdio.h>

#define dprint(expr) printf(#expr"=%d\n",expr);

int main()
{
    int a=20,b=10;
    dprint(a/b);
    return 0;
}

/*
   输出:a/b=2
 */

\#\#的作用----符号连接操作符

作用:将宏定义的多个形参转换成一个实际参数名。

  • 当\#\#连接形参时,\#\#前后的空格可有可无。
  • 将左右两边的参数做整体的字符串拼接替换。
  • 同#,对于##的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
  • 经过##替换后的内容必须能够作为一个合法的变量。
#define f(a,b) a##b
则
f(1,2) 替换拼接成12
f(i,1) 替换拼接称i1

以上f(i,1) 中,如果程序中没有i1的定义,则即便是通过了宏替换,也不能编译通过。

#include <stdio.h>

#define f(a,b) a##b
#define g(a)  #a
#define h(a) g(a)

int main()
{
    int a2=3;
    //printf("%s\n",f(a,2));错误,没有a2的字符串变量 
    printf("%d\n",f(a,2));//正确
    printf("%s\n", h(f(1,2)));
    printf("%s\n", g(f(1,2)));
    return 0;
}

/*输出
3
12
f(1,2)
*/
0

评论 (0)

取消