C/C++ 中 assert 和 static_assert 的宏实现

本文详细介绍了C语言中的assert宏和static_assert静态断言的实现原理及使用方法。assert用于运行时检查条件,当条件不满足时打印错误信息。static_assert则在编译期间检查条件,确保代码在编译阶段的正确性。do-while(0)技巧在宏定义中用于避免语法错误,提供了一种有效包裹多条语句的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

assert 用于运行时的断言

实现方法如下

#define assert(x)		\
	do { if (!(x)) printf("assertion failed: %s", #x); } while (0)

在宏语句中,参数可以通过前置 # ,将其转化为字符串常量。

static_assert 用于编译期断言

实现方法如下:

#define static_assert(a, b) \
	do { switch (0) case 0: case (a): ; } while (0)

原理:

  1. switch 每一个分支都有一个或多个整数值常量或常量表达式标记
  2. switch 各个分支表达式必须互不相同

do{ } while (0) 技巧

采用 do-while 技巧,可以将多条语句包裹,从而保证编译时不会出错。
例如:

#define DUMP_WRITE(addr, nr) \
	do { memcpy(bufp, addr, nr); bufp += nr; } while (0)

# 如果去掉 do-while 的包裹,就会造成下面语句中的 else 分句匹配错误,从而编译失败
if (addr)
	DUMP_WRITE(addr, nr);
else
	do_something_else();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值