c语言中#和##

本文主要讲述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)
*/