1.什么是宏定义:宏定义是C语言提供的三种预处理其中的一种,这三种定义包含:宏定义、文件包含。条件编译,宏定义是对于文本进行替换,比如:
#define MAX 1000 则这里就是用1000替换MAX ,需要强调的是,宏定义不做文件的检查,即不做类型的判断。
2.定义宏函数:还是举例子说明:#define SQUARE(x) x*x 若在上述声明后把x设为5;则预处理器就会用5*5来替换上述x;这里需要强调括号的问题,假若printf(“%d\n”,SQUARE(x+1)),这里最终输出的值为11而不是36,应为预处理先将X变为了10,最后输出相当于10+1=11。总之宏是替换。
例1:
用宏定义找出两个数最大值
#define MAX(a,b) ((a)>(b)?(a):(b))
例2:
用宏定义交换一个数的奇偶位
分析一下:简单来说就是将第0位和第1位交换,第二位和第三位交换,以此类推,我们需要将奇数位和偶数位找出来,(x&0x55555555)>>1得到奇数位与原来相同但偶数位为0的二进制数,(x&0xAAAAAAAA)>>1得到偶数位与原来相同但奇数位为0的二进制数;最终两个二进制数按位或就得到结果。
#define SWAP(x)\
((x&0x55555555)>>1|(x&0xAAAAAAAA)>>1)
3.#和##:其中#是把一个宏参数变成对应的字符串,比如:
int i=10;
#define PRINT(FORMAT, VAULE)\ //最后的'\'是续行作用。
printf(“the vaule of "#VAULE”is"FORMAT"\n",VAULE);
.....
printf(“%d”,i+5); 在这部分代码中#VAULE会被预处理为VAULE ,最终会得到the vaule of i+3 is 13。
那对于##,它可以把两边的符号合成一个符号,需要强调的是 最终必须产生一个合法的标识符。
4.宏的优缺点:宏的速度快,宏与类型无关,但除非宏比较短,否则会大大增加程序的长度,而且宏没法调试,其次宏不够严谨。