如何在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)
关键改动说明
- 字符串化运算符
#operator:预处理阶段会把你传入的运算符(比如<、==)转换成对应的字符串("<"、"=="),这样格式化输出时就能直接显示运算符符号了。 do-while(0)包裹:这是C宏的常用技巧,能避免宏在条件语句中出现语法错误(比如如果把assert直接写在if后面不加大括号,不会导致后续代码被错误纳入判断分支)。- 调整格式化字符串:新增
%s占位符对应运算符字符串,同时优化了输出格式(加了冒号),让错误信息更易读。
保持原有调用方式
你原来的调用代码完全不用改,比如:
assert(millis, <, maxtime);
当断言失败时,astrbuf会生成类似这样的内容:
\nAssert error main.c 42: 1234 < 500\n
后续的asserted()函数不管是本地打印还是通过CAN发送,都能正确输出包含运算符的错误信息。
额外注意点
- 你的
asprintf使用没问题,Embitz基于GCC完全支持这个POSIX函数;如果需要更严格的标准兼容性,可以换成snprintf配合手动内存分配,但当前实现无需改动。 - 这个宏也支持
<=、>=、!=这类复合运算符,#operator会自动处理成对应的字符串。
内容的提问来源于stack exchange,提问作者user3824211
相关产品推荐
相关产品推荐

