一、#
名称:字符串化操作符
将宏定义中传递的参数名称转换为用双引号将参数名称引起来的字符串。
使用条件:只能在包含传递的参数的宏定义中使用,并且必须位于宏定义体的参数名称之前
示例:
#defineexample1(instr ) #instr
stringstr=example1(ABC ); 会展成: string str='abc ';
注意:空格的处理
a、忽略传入参数名称前后的空格。
例如,str=example1(ABC ); str='abc ';
b、如果传递的参数名称之间有空格,编译器会自动连接每个子字符串,每个子字符串只连接一个空格,并忽略任何多余的空格。
例如,str=exapme1(ABCdef ); str='abc def ';
二、###
名称:符号连接运算符
角色:将多个由宏定义的形状参数名称连接到单个实际参数名称
使用条件:只能在包含传递的参数的宏定义中使用,并且必须位于宏定义体的参数名称之前
示例:
#defineexamplenum(n ) num##n
intnum=examplenum(9; int num=num9;
注意:
1、通过##连接形参时,##前后的空间可以有也可以没有。
例如,#defineexamplenum(n ) num ## n相当于#defineexamplenum(n ) num ## n
2、连接后的实际参数名称必须是实际存在的参数名称或编译器已知的宏定义
三. @#
名称:字符化操作符
角色:将传递的单个字符参数名称转换为字符,并将其包含在一对单个引用中。
使用条件:只能在具有传入参数的宏定义中使用,并且必须位于宏定义体的参数名称之前。
示例:
#definemakechar(x ) @#X
a=makechar(b ); 展开后,a='b ';
四、三
名称:行继续操作符
角色:如果定义的宏无法在一行中完全表示,则可以使用表示以下行继续定义宏:
注意:换行不能切单词。 只能在空间的地方做。