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