ESP-IDF中ESP_LOGE打印十六进制时'-'符号有什么作用
问题解答
这个写法是专门适配mbedtls接口返回值规则的实用技巧,核心目的是让打印出的错误码可以直接和官方定义的错误码常量对应,省去补码换算的麻烦,两个负号的作用分别如下:
- 格式字符串里的
-是固定字面量,打印时会直接输出在十六进制数值前,匹配mbedtls错误码为负值的定义习惯 - 参数里的
-ret是对返回值做取负运算:mbedtls的接口出错时统一返回负整数,错误码的实际定义值是正的十六进制常量(比如内存分配失败的错误码定义为0x7F00,接口返回时会返回-0x7F00赋值给ret)。
C语言中
%x格式符会按照无符号整数解析传入的参数,如果直接传入存储了负值的ret变量,打印出的会是负数的补码值(32位系统下-0x7F00的补码为0xFFFF8100),和官方错误码表的数值完全对不上,查错效率极低。
给你举个实际运行的对比例子,假设握手失败返回MBEDTLS_ERR_SSL_ALLOC_FAILED错误:
// ret实际值为 -0x7F00 ESP_LOGE(TAG, "直接打印ret: 0x%x", ret); // 输出:直接打印ret: 0xffff8100,无法直接匹配错误码表 ESP_LOGE(TAG, "取负打印: -0x%x", -ret); // 输出:取负打印: -0x7f00,和官方定义的错误码数值完全一致,可直接查表定位问题
这种写法是嵌入式网络编程里打印mbedtls错误码的通用惯例,唯一的小问题是当ret为0(接口调用成功)时会打印出-0x0,但错误日志分支本身只有调用失败才会触发,不会影响实际使用。
内容的提问来源于stack exchange,提问作者Maaz Sk
相关产品推荐
相关产品推荐

