C语言常用的宏定义

【C语言宏定义】来,看看这20个常用的宏定义! 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。 下面列举一些成熟软件中常用的宏定义: —————————————— 1、防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif —————————————— 2、重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef unsigned char boolean; /* Boolea 阅读详情

引言

  • 在C语言编程中,宏定义不仅可以使代码更简洁,而且在某些场景下能够显著提高代码的性能和可维护性。本文将介绍一些常见的高级宏定义及其使用方法。

1. offsetof

offsetof 宏用于计算结构体成员相对于结构体起始位置的偏移量,常用于与 container_of 一起使用。

#include <stddef.h>

struct my_struct {
    int a;
    float b;
    char c;
};

size_t offset = offsetof(struct my_struct, c);

2. typeof

typeof 宏用于获取变量的类型,可以在编写宏定义时确保类型一致性。

#define SWAP(a, b) do { \
    typeof(a) _tmp = (a); \
    (a) = (b); \
    (b) = _tmp; \
} while (0)

int x = 5, y = 10;
SWAP(x, y);  // x 现在是 10, y 是 5

3. likely 和 unlikely

这些宏用于提示编译器某些条件更可能(或不太可能)成立,从而优化分支预测。

#define likely(x) __builtin_expect((x), 1)
#define unlikely(x) __builtin_expect((x), 0)

if (likely(x > 0)) {
    // 很可能执行的代码路径
} else {
    // 不太可能执行的代码路径
}

4. container_of

container_of 宏用于从成员指针获取结构体指针。

#define container_of(ptr, type, member) \
    (type *)((char *)(ptr) - offsetof(type, member))

5. list_entry 和 list_for_each

在实现内核链表时,list_entry 和 list_for_each 是非常有用的宏,简化了链表操作。

#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)

#define list_for_each(pos, head) \
    for (pos = (head)->next; pos != (head); pos = pos->next)

6. stringify

stringify 宏用于将宏参数转换为字符串。

#define stringify(x) #x

#define DEBUG_VAR(var) printf("The value of " #var " is %d\n", var)

int var = 10;
DEBUG_VAR(var);  // 输出:The value of var is 10

7. ARRAY_SIZE

用于计算数组的元素个数,非常适合在编写数组相关的宏或函数时使用。

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

int array[10];
size_t size = ARRAY_SIZE(array);  // size 是 10

8. container_of_safe

这是一个更安全的 container_of 版本,避免空指针问题。

#define container_of_safe(ptr, type, member) \
    ({ \
        typeof(ptr) _ptr = (ptr); \
        _ptr ? (type *)((char *)(_ptr) - offsetof(type, member)) : NULL; \
    })

9. MIN 和 MAX

用于计算两个数中的最小值和最大值。

#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

10. ABS

用于计算一个数的绝对值。

#define ABS(x) ((x) < 0 ? -(x) : (x))

11. NULL

表示空指针。

#define NULL ((void*)0)

12. BIT 和 SET_BIT、CLEAR_BIT、TOGGLE_BIT

用于位操作的宏定义。

#define BIT(x) (1 << (x))
#define SET_BIT(value, bit) ((value) |= BIT(bit))
#define CLEAR_BIT(value, bit) ((value) &= ~BIT(bit))
#define TOGGLE_BIT(value, bit) ((value) ^= BIT(bit))

13. IS_POWER_OF_TWO

用于判断一个数是否是2的幂。

#define IS_POWER_OF_TWO(x) ((x) != 0 && ((x) & ((x) - 1)) == 0)

14. ROUND_UP 和 ROUND_DOWN

用于向上和向下舍入到最接近的整数倍。

#define ROUND_UP(x, multiple) (((x) + (multiple) - 1) / (multiple) * (multiple))
#define ROUND_DOWN(x, multiple) ((x) / (multiple) * (multiple))

15. ALIGN

用于将地址或大小对齐到指定的边界。

#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))

16. SWAP

交换两个变量的值。

#define SWAP(a, b) do { \
    typeof(a) _tmp = (a); \
    (a) = (b); \
    (b) = _tmp; \
} while (0)

17. CONCAT

用于宏参数的连接

#define CONCAT(a, b) a##b

18. CHECK_FLAG

检查某个标志位是否被设置。

#define CHECK_FLAG(value, flag) (((value) & (flag)) != 0)

end
在这里插入图片描述

【C语言】宏定义详解 宏定义是C语言中强大的预处理工具,能够提高代码的灵活性和可维护性。然而,它们也带来了潜在的风险,如宏名冲突、运算优先级问题和调试困难。在使用宏定义时,务必要仔细考虑它们的优缺点,采取适当的措施来避免潜在问题。 阅读详情

相关推荐

20个C语言中常用宏定义总结

20个C语言中常用宏定义总结

C语言宏定义大全

需要注意的是,由于宏只是简单的文本替换,不进行语法检查,因此在使用带参数的宏时需要特别小心,以避免出现替换错误或逻辑错误。在这个例子中,如果宏MAX被定义为大于50的数,则会输出“MAX is greater than 50”,否则输出“MAX is less than or equal to 50”。如果“整型常量表达式1”的值为真,则编译“程序段1”,否则继续判断“整型常量表达式2”,依此类推。0表示假,1表示真。在后续的代码中,可以使用SQUARE(x)来代替(x) * (x),其中x是一个参数。

zlp的博客 1687

关于token无痛刷新的两个方案

目录方案一方案二 方案一 思路: 后端需要返回一个token过期的时间,在请求发起前拦截每个请求,判断token的有效时间是否已经过期,如果已过期,则暂时将请求挂起,先刷新token后再继续请求。 前期思考: 返回过期时间是为了判断是否过期的,但是如果服务器时间和系统时间不一致呢? 如果同时发起多个请求时怎么办? 实现: 因为是在请求前进行拦截,所以这里用axios的axios.interceptors.request.use()方法 首先,关于服务器时间和系统时间不一致的问题,我的解决方法是:

Yugoup的博客 2716

【C语言基础】宏定义的用法详解

本篇总结并较为详细地阐述了宏定义的多种用法,

欢迎时常光顾我的干货超市,热衷于AIoT!! 6542

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 418

C语言中常用宏定义集锦

宏定义可以防止出错,提高可移植性,可读性,方便性。 网络上收集一些好的宏定义来丰富自己的知识。 1、防止头文件重复引用 #ifndef _XXX_H #define _XXX_H #endif  //end  _XXX_H 2、重新定义一些类型,防止因为平台、编译器的不同而产生类型字节数差异的不同,方便移植 typedef unsigned int   uint32 typedef

sur_way的专栏 816

zabbix添加IBM服务器SNMPV3监控

本地采用欧冠的是zabbix5.0,服务器型号是SR860,使用snmpv3因为只支持这个,醉了。说明:本地采用欧冠的是zabbix5.0,服务器型号是SR860。

萌新包大人的博客 1984

20个C语言常用宏定义,可防止出错

关注、星标公众号,直达精彩内容来源:玩转嵌入式1. 防止一个头文件被重复包含1#ifndefCOMDEF_H 2#defineCOMDEF_H 3//头文件内容 4#endif2. 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。1typedefunsignedcharboolean;/*Booleanvaluetype.*/ 2typede...

李肖遥的专栏 568

新手必看!用FFmpeg一键合并ts文件的5种方法(含Windows/Mac终端命令)

本文详细介绍了使用FFmpeg合并TS视频文件的5种实用方法,涵盖Windows和Mac终端命令操作。从基础安装到进阶技巧,包括处理音频不同步、批量处理多个视频等场景,帮助用户轻松将m3u8分片视频合并为完整mp4文件,提升视频处理效率。

weixin_29065959的博客 558

把 SAP ABAP ALE 与 IDoc 玩明白:从架构、配置到排错的一套闭环方法

本文介绍了SAP集成中ALE与IDoc的核心概念与实战应用。ALE作为SAP分布式应用框架,通过异步消息机制实现系统间数据交换,其三层架构隔离业务与传输细节。IDoc作为标准化消息容器,包含控制、数据和状态记录。文章详细解析了配置要点(端口、伙伴参数)、处理流程(Process Code)、排错工具(BD87、WE09)及同系统测试方法,并提供了发送程序代码骨架。通过架构认知→配置→开发→运维的完整路径,帮助读者掌握ALE/IDoc的实际操作技能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 221

C语言宏定义技巧(常用宏定义)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> C语言宏定义技巧(常用宏定义) <span id= "ob_logd35550">写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,

龙山三人团 1037

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 333

C语言常用宏定义

01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int 

luozhan的专栏 761

TMC2240 芯片数据手册解读|第三篇 TMC2240 芯片引脚配置与说明

本文详细解析了TMC2240芯片的两款封装(TQFN32和TSSOP38-EP)的引脚分布、电气属性及硬件设计要点。内容涵盖:1)芯片内部功能架构,包括供电、运动控制等五大链路;2)两款封装的核心规范与适用场景;3)七大引脚分类详解(电源、控制、编码器等)及接线要求;4)PCB设计避坑指南,强调电源分割、电荷泵布局等关键点。文章提供完整的原理图绘制和硬件调试指导,适合不同基础的工程师参考实践。

BackCatK Chen的博客 1092

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言宏定义常用方法总结

总结了C语言宏定义常用方法。以便及时复习。

ZZZZZBUG的博客 295

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C语言常用宏定义

01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int 

醉里挑灯看剑 795

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux环境下C语言常用宏定义

http://baike.baidu.com/view/2714887.htm l  防止一个头文件被重复包含           #ifndefCOMDEF_H    #define COMDEF_H    //头文件内容    #endif   l  重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。          typede

潜龙勿用 3769

C语言常用宏定义技巧

C语言常用宏定义技巧 1、防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif2、重新定义 一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedefunsigned...

aezympxj84131的博客 88
上一篇: stm32f103c8t6hal库使用看门狗
下一篇: STM32printf重定向到串口含armcc和gcc两种方案
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值