| |
| #define CALC_VA_COUNT(arg...) \ |
| ({ \ |
| int count = 0; \ |
| int insideQuotes = 0; \ |
| const char *str = #arg; \ |
| printf("D> CALC_VA_COUNT: %s\n", str); \ |
| while (*str != '\0') { \ |
| if (*str == '"') { \ |
| insideQuotes = !insideQuotes; \ |
| } else if (*str == ',' && !insideQuotes) { \ |
| count++; \ |
| } \ |
| str++; \ |
| } \ |
| ++count; \ |
| }) |
| |
| #define CHECK(expr, ...) \ |
| do { \ |
| if (!(expr)) { \ |
| printf("check fail: \"%s\" @ %s, %u\r\n", #expr, __FILE__, __LINE__); \ |
| return __VA_ARGS__; \ |
| } \ |
| } while(0) |
| #define ASSERT(expr) (void)((!!(expr)) || (printf("assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"))) |
| |
| ASSERT(arg != NULL) |
| |
| #define ASSERT(expr) (void)((!!(expr)) && (printf("assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"))) |
| |
| ASSERT(arg == NULL) |
| |
| #define ASSERT(expr) (int)((!!(expr)) || (printf("assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"), Abort())) |
| |
| if (!ASSERT(arg != NULL)) { |
| return; |
| } |
| |
| #define ASSERT(expr) (int)((!!(expr)) && (printf("assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"), Abort())) |
| |
| if (!ASSERT(arg == NULL)) { |
| return; |
| } |
| int Abort(void) |
| { |
| printf("reset reboot!\n"); |
| |
| } |
示例:
| |
| #include <stdio.h> |
| |
| #define CALC_VA_COUNT(arg...) \ |
| ({ \ |
| int count = 0; \ |
| int insideQuotes = 0; \ |
| const char *str = #arg; \ |
| printf("D> CALC_VA_COUNT: %s\n", str); \ |
| while (*str != '\0') { \ |
| if (*str == '"') { \ |
| insideQuotes = !insideQuotes; \ |
| } else if (*str == ',' && !insideQuotes) { \ |
| count++; \ |
| } \ |
| str++; \ |
| } \ |
| ++count; \ |
| }) |
| |
| #define CHECK(expr, ...) \ |
| do { \ |
| if (!(expr)) { \ |
| printf("I> check fail: \"%s\" @ %s, %u\r\n", #expr, __FILE__, __LINE__); \ |
| printf("D> __VA_ARGS__: %s\r\n", #__VA_ARGS__); \ |
| if (CALC_VA_COUNT(__VA_ARGS__) > 1) printf("W> too many parameters. last effective!\r\n"); \ |
| return __VA_ARGS__; \ |
| } \ |
| } while(0) |
| |
| #define ASSERT1(expr) (void)((!!(expr)) || (printf("A> assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"))) |
| #define ASSERT2(expr) (void)((!!(expr)) && (printf("A> assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"))) |
| #define ASSERT3(expr) (int)((!!(expr)) || (printf("A> assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"), Abort1())) |
| #define ASSERT4(expr) (int)((!!(expr)) && (printf("A> assert fail: \"%s\" @ %s, %u", #expr, __FILE__, __LINE__), printf("\r\n"), Abort2())) |
| |
| int Abort1(void) |
| { |
| printf("reset reboot!\n"); |
| |
| } |
| |
| int Abort2(void) |
| { |
| printf("reset reboot!\n"); |
| |
| return -1; |
| } |
| |
| void test_assert(void *pointer) |
| { |
| ASSERT1(pointer != NULL); |
| ASSERT2(pointer == NULL); |
| if (ASSERT3(pointer != NULL)) { |
| printf("ASSERT3\n"); |
| } |
| if (!ASSERT3(pointer != NULL)) { |
| printf("!ASSERT3\n"); |
| } |
| if (ASSERT4(pointer == NULL)) { |
| printf("ASSERT4\n"); |
| } |
| if (!ASSERT4(pointer == NULL)) { |
| printf("!ASSERT4\n"); |
| } |
| } |
| |
| void test_check(void *pointer) |
| { |
| CHECK(pointer == NULL); |
| printf("check @%s\n", __func__); |
| } |
| |
| void test_check1(void *pointer) |
| { |
| CHECK(pointer != NULL); |
| printf("check @%s\n", __func__); |
| } |
| |
| char *test_check2(void *pointer) |
| { |
| CHECK(pointer != NULL, "check fail!"); |
| printf("check @%s\n", __func__); |
| } |
| |
| char *test_check3(void *pointer) |
| { |
| CHECK(pointer != NULL, "check fail!", __func__); |
| printf("check @%s\n", __func__); |
| } |
| |
| int main(void) |
| { |
| int *arg; |
| printf("Hello Assert!\n"); |
| test_assert(arg); |
| printf("Hello check!\n"); |
| test_check(arg); |
| test_check1(arg); |
| printf("check result: %s\n", test_check2(arg)); |
| printf("check result: %s\n", test_check3(arg)); |
| return 0; |
| } |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2022-04-14 【RTOS】基于RTOS的嵌入式系统看门狗策略