定义
- 作为Stringizing Operator(#),字符串化;
- 作为Charizing Operator(#@),字符化;
- 作为Token-Pasting Opertor(##),连接化;
- 作为下一行继续此宏的定义(\),行连接化;
举例
-
作为Stringizing Operator(#),字符串化;
#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"
另外:# 还有预处理作用,#开头的语句常常是预处理命令,如#define、#if、#else、#end等等,用来在代码编译时进行一些操作。
-
作为Charizing Operator(#@),字符化;
#@
只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转换成字符,以一对单引用括起来其实就是给x
加上单引号,结果类型为const char
#define makechar(x) #@x
a = makechar(b); 这条语句将被扩展为
a = 'b'; 注意单引号字符不能使用这样的字符化。
注意:貌似对字符串的字符化效果不好
例如:当为多字符时,无法字符化
#include <iostream>
#define makechar(x) #@x //#@连在一起作字符化,
int main() {
std::cout << makechar(b) << std::endl;//输出:b
std::cout << makechar(bc) << std::endl;//输出:25187
std::cout << makechar(abc) << std::endl;//输出:6382179
return 0;
}
-
作为Token-Pasting Opertor(##),连接化;
#define paster( n ) printf( "token" #n " = %d", token##n )
其功能是把两边的字符串连接起来形成一个变量名。
int token9 = 9;
如果一个数字作为此宏的参数调用的话: paster( 9 );
宏被展开为
printf( "token" "9" " = %d", token9 );
进而成为这样的语句:printf( "token9 = %d", token9 );
-
作为下一行继续此宏的定义(\),行连接化;
\
行继续操作当定义的宏不能用一行表达完整时,可以用\
(反斜线)表示下一行继续此宏的定义。
#define REFLECTION_TYPE(class_name) \
namespace Reflection \
{ \
namespace TypeFieldReflectionOparator \
{ \
class Type##class_name##Operator; \
} \
};
该文部分引用其他博客: