C++宏定义中\、##、##、#@的作用

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

猜你喜欢

转载自blog.csdn.net/lifesize/article/details/126293353
今日推荐