You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言自定义Assert中显示比较运算符?(STM32+GCC环境)

解决方案:让断言输出显示比较运算符

你的核心问题是没法在断言失败信息中显示==、<这类运算符符号,这可以通过C预处理器的**字符串化运算符#**来解决。这个运算符能把宏参数直接转换成对应的字符串字面量,刚好满足你的需求。

修改断言宏定义

把你的.h文件中的宏改成下面这样,既能保持原有功能,又能输出运算符符号:

extern char *astrbuf;

#define assert(left, operator, right) \
do { \
    if(!((left) operator (right))) { \
        asprintf(&astrbuf, "\nAssert error %s %d: %ld %s %ld\n", __FILE__, __LINE__, \
            (u32)(left), #operator, (u32)(right)); \
        asserted(); \
    } \
} while(0)

关键改动说明

  1. 字符串化运算符#operator:预处理阶段会把你传入的运算符(比如<、==)转换成对应的字符串("<"、"=="),这样格式化输出时就能直接显示运算符符号了。
  2. do-while(0)包裹:这是C宏的常用技巧,能避免宏在条件语句中出现语法错误(比如如果把assert直接写在if后面不加大括号,不会导致后续代码被错误纳入判断分支)。
  3. 调整格式化字符串:新增%s占位符对应运算符字符串,同时优化了输出格式(加了冒号),让错误信息更易读。

保持原有调用方式

你原来的调用代码完全不用改,比如:

assert(millis, <, maxtime);

当断言失败时,astrbuf会生成类似这样的内容:

\nAssert error main.c 42: 1234 < 500\n

后续的asserted()函数不管是本地打印还是通过CAN发送,都能正确输出包含运算符的错误信息。

额外注意点

  • 你的asprintf使用没问题,Embitz基于GCC完全支持这个POSIX函数;如果需要更严格的标准兼容性,可以换成snprintf配合手动内存分配,但当前实现无需改动。
  • 这个宏也支持<=、>=、!=这类复合运算符,#operator会自动处理成对应的字符串。

内容的提问来源于stack exchange,提问作者user3824211

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:56:41