1.\行继续操作
\
行继续操作当定义的宏不能用一行表达完整时,可以用\
(反斜线)表示下一行继续此宏的定义。
例:
#define REFLECTION_TYPE(class_name) \
namespace Reflection \
{ \
namespace TypeFieldReflectionOparator \
{ \
class Type##class_name##Operator; \
} \
};
2.#的预处理作用
#开头的语句常常是预处理命令,如#define、#if、#else、#end等等,用来在代码编译时进行一些操作。
3.#的字符串化作用
符号 # 也称为字符串化运算符(stringify operator 或 stringizing operator),它会把宏调用时的实参(调用时传递给函数的参数叫做实际参数)转换为字符串。
例:
#include "stdio.h"
using namespace std;
#define print(n) printf("print:"#n"")//把实参n转换为了字符串
int main()
{
print(5);
return 0;
}
输出为:
print:5
4.##连接操作符号
符号 ## 则是连接符号,其功能是把两边的字符串连接起来形成一个变量名。
例:
#include "stdio.h"
using namespace std;
#define print(n) printf("%d",num_##n)//把实参n转化为字符串后与num_相连,形成num_n变量名
int main()
{
int num_5 = 54645;
print(5);//num_##n在编译时被替换为num_5,所以被打印的是num_5的值
return 0;
}
输出为:
54645
5.#@字符化操作符
#@
只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转换成字符,以一对单引用括起来其实就是给x
加上单引号,结果类型为const char
。
#include<stdio.h>
using namespace std;
#define print(arg) printf("%c",#@arg)//把arg转化为了单字符
int main()
{
print(1);
}
输出为
1