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

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

相关推荐
Mr_Xuhhh15 小时前
YAML相关
开发语言·python
咖啡の猫16 小时前
Python中的变量与数据类型
开发语言·python
前端达人16 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
汤姆yu16 小时前
基于springboot的电子政务服务管理系统
开发语言·python
全栈师16 小时前
C#中控制权限的逻辑写法
开发语言·c#
S***q19216 小时前
Rust在系统工具中的内存安全给代码上了三道保险锁。但正是这种“编译期的严苛”,换来了运行时的安心。比如这段代码:
开发语言·后端·rust
打点计时器17 小时前
matlab 解决wfdb工具使用本地数据集报错
开发语言·matlab
zmzb010317 小时前
C++课后习题训练记录Day38
开发语言·c++
夏霞17 小时前
c# 使用vs code 创建.net8.0以及.net6.0 webApi项目的教程
开发语言·c#·.net
T***u33317 小时前
Rust在Web中的 Web框架
开发语言·后端·rust