#define指令中个常见预处理操作符
1. 字符串化(#)
# 操作符用于有参数的宏定义中, 把宏参数转换成一个常量字符串.
# 操作符放在宏参数的前面,它将把宏参数值加上“”, 转换成字符串。
例如:
#define stringer( x ) printf( #x "/n" )
int main()
{
stringer( In quotes in the printf function call/n );
stringer( "In quotes when printed to the screen"/n );
stringer( "This: /" prints an escaped double quote" );
}
// 经过宏的预处理后转换为下面代码:
int main()
{
printf( "In quotes in the printf function call/n" "/n" );
printf( "/"In quotes when printed to the screen/"/n" "/n" );
printf( "/"This: ///" prints an escaped double quote/"" "/n" );
}
程序的运行结果:
In quotes in the printf function call
"In quotes when printed to the screen"
"This: /" prints an escaped double quotation mark"
通过观察发现,宏预处理后在宏参数前后添加了""
2. 字符化(#@)
#@ 操作符用于带参数的宏定义中, 放在宏参数的前面,实际的参数值将被单引号包括, 作为字符
例如:
#define makechar(x) #@x
a = makechar(b);
经过宏展开:
a = 'b';
3. 符号粘贴操作符(token paste operator): ##
##是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
其中,分隔的作用类似于空格。在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。
但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##来替代空格。
另外一些分隔标志是,包括操作符,比如+, -, *, /, [,] ,所以尽管下面的
宏定义没有空格,但是依然表达有意义的定义:define add(a, b) a+b
而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来。
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
paster( 9 );
经过宏展开
printf( "token" "9" " = %d", token9 );
变成
printf( "token9 = %d", token9 );