这里记录几种C语言常用的宏定义。
①形如:#define UNUSED(x) (void)(x)
这种宏定义一般用于规范编程,假设一个子函数中,需要传入3个参数,但如果在子函数内部只需要使用了2个参数,如果对另一个参数置之不理,有些编译器就会报错,这时候就可以使用这个宏来消除错误。主要用法可以看下面的例子:
#include <stdio.h>
#define UNUSED(x) (void)(x)
void sub(int a,char b) {
UNUSED(a);
printf(&b);
}
int main() {
sub(1,'z');
return 0;
}
上述代码的打印结果:z
上面声明的sub函数中,传入了两个参数,但实际打印只用了第二个参数,如果不管第一个参数,有的编译器就会报错,所以我们定义了UNUSED宏,调用这个宏,就可以避免此类错误。
注意:UNUSED这个名字是可以改的,只要写法一致就行,但是最好名字不要乱起,要一看就能明白其含义即可。
②形如:#define SWAPWORD(x) (x)
这种宏定义的含义很清楚,给SWAPWORD后传入一个参数,这个参数保持不变,这并没有什么意义,这只是这种宏最简单的形式,一般其用法会如下所示:
#define SWAPWORD(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
这个我们来举个例子说明,假设我们有SWAPWORD(0xBBCC),(x) & 0xFF00)和(x) & 0x00FF)即将这个x的高八位和低八位都取出来,得0xBB00和0x00CC,然后将0xBB00右移8位得0xBB,将0x00CC左移8位得0xCC00,再将两个得到的值或处理,得0xCCBB。这样一看,这个宏的作用就是将传入的一个16位字(WORD)的高半字节和低半字节进行交换。这里知识举了一个例子,具体后面怎么设置,都要看具体的需求。看一下代码例子:
#include <stdio.h>
#define SWAPWORD(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
int main() {
int a = 0xBBCC;
printf("%x\n", a);
a=SWAPWORD(a);
printf("%x\n",a);
return 0;
}
打印结果:
bbcc
ccbb
这个宏的名字最好也是按照其功能进行取名,好识别。
③使用##
##在宏定义中,就相当于粘贴。一般用法形如:#define AFFIX(a, b) a ## b
假设你定义了一个变量int xy=5;这时候就可以使用AFFIX(x, y)来表示这个变量,即AFFIX就是通过##将这x和y粘起来称为xy。例子如下:
#include <stdio.h>
#define AFFIX(a, b) a ## b
int main() {
int xy = 5;
int a = AFFIX(x, y);
printf("a: %d\n", a);
return 0;
}
结果:
a: 5
这里只是记录了最基本的用法举例,具体使用时还要接着学习。