do whlie是高中就学过的循环体
while(0) 表示在终止循环前始终都会先运行一次循环体,
用define封装函数的时候经常可以用到这个技巧。
另外一个技巧就是粘贴符##的使用。
#include<iostream>
#include<stdio.h>
using namespace std;
#define paster(n) printf("token" #n " = %d \n", token##n)
#define SWAP(a,b) \
do{ \
int temp = a; \
a = b; \
b = temp; \
} while(0)
int main()
{
int x = 100;
int y = 10;
SWAP(x, y);
int token9 = 9;
paster(9);
token9 = 19;
paster(9);
cout << "x" << x <<endl;
cout << "y" << y << endl;
system("pause");
return 0;
}
输出结果:
token9 = 9
token9 = 19
x10
y100
这个里面的\是表示下一行和当前行属于同一个部分,define的最后一条语句不要加;
因为调用的时候SWAP(a, b);里面的;会加在最后一条语句上。这就相当于用宏完成了一个函数。
连接符号## 由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。
但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。
同时值得注意的是#符是把传递过来的参数当成字符串进行替代。