在使用#define
进行宏定义的时候,会使用到#
和##
两种运算符:
#
:字符串化运算符(Stringizing operator)##
:标记粘贴运算符(Token-pasting operator)
字符串化运算符(Stringizing operator)#
在类函数的宏(Function-like macros)中,#
运算符可以把宏定义中的参数转化为字符串字面量(string literals)。
// C program to illustrate (#) operator
#include <stdio.h>
// Macro definition using the stringizing operator
#define mkstr(s) #s
int main(void)
{
// Printing the stringized value of "Skillvertex"
printf(mkstr(Skillvertex));
return 0;
}
Output
Skillvertex
解释
宏定义mkstr
把字符串Skillvertex
转化为字符串字面量"Skillvertex"
,即printf("Skillvertex")
。
标记粘贴运算符(Token-pasting operator)##
在宏定义中,##
运算符可以把该运算符一前一后的两个标记(Token)连接在一起,结合形成一个新的标记。
// C program to illustrate (##) operator
#include <stdio.h>
// Macro definition using the Token-pasting operator
#define concat(a, b) a##b
int main(void)
{
int xy = 30;
// Printing the concatenated value of x and y
printf("%d", concat(x, y));
return 0;
}
Output
30
解释
宏定义concat
用于把标记a
和b
连接在一起,形成ab
,调用的时候把x
和y
连接在一起,形成xy
,xy
被赋值为30,所以输出30。