C语言:宏定义的#和##用法

在查看学习操作系统的过程,会经常遇到各种宏定义,其中有两种宏参数的定义方式较为特殊,分贝是#和##。
其中#为将宏参数按照符号名直接解析成字符串;##为参数连接符号。

#include <stdio.h>
#include <string.h>
#include <climits>
#define STRCPY(a,b) strcpy(a##_p, #b) //把第一参数后边加上字符_p,把第二个参数变成字符串

//转换宏,类Lisp宏编译功能,多一层转换宏,这样宏定义就不再是仅仅的字符替换了
//转换宏是指将所有的宏参数在这一层全部展开
#define _STR(s)  #s //将参数s按照符号名解析成字符串,但并不求值
#define STR(s) _STR(s) //转换宏,两层宏定义,便可以对参数进行求值了
//STR(INT_MAX) ->  _STR(0x7fff ffff) -> 0x7fffffff

#define A 2
#define _Conju(a, b) a##*##b
#define Conju(a,b) _Conju(a,b) //转换宏,这样科学计数法便被求值了,而不是停留在字符串上
//Conju(A,A) -> _Conju((2), (2)) -> int(2e2)

#define _ConjuValueName(a, b) a##b
#define ConjuValueName(a, b) _STR(_ConjuValueName(a,b))

int main()
{
    char var1_p[20];
    char var2_p[30];
    strcpy(var1_p, "weapon");
    strcpy(var2_p, "tank");

    STRCPY(var1, var2); //等价strcpy(var1_p, "var2");
    STRCPY(var2, var1); //等价strcpy(var2_p, "var1");

    printf("%s\n", var1_p);//输出var2
    printf("%s\n", var2_p);//输出var1

    printf("%d\n", Conju(A, A)); //输出4
    printf("int max: %s\n", STR(INT_MAX));//INT_MAX定义在climits中,输出2147483647 ~ 2G

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值