C语言中的部分常用宏定义格式

这里记录几种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

这里只是记录了最基本的用法举例,具体使用时还要接着学习。

相关推荐
西猫雷婶15 分钟前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
开发语言·python·opencv
kiiila15 分钟前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
罗伯特祥27 分钟前
C调用gnuplot绘图的方法
c语言·plot
小_太_阳41 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾44 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
唐 城1 小时前
curl 放弃对 Hyper Rust HTTP 后端的支持
开发语言·http·rust
嵌入式科普1 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
码银3 小时前
【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割
开发语言·python
从善若水3 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
lqqjuly3 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++