【TDengine源码阅读】TAOS_DEF_ERROR_CODE(mod, code)
2025年5月13日,周二清晨
#define TAOS_DEF_ERROR_CODE(mod, code) ((int32_t)((0x80000000 | ((mod)<<16) | (code))))
这段代码定义了一个宏 TAOS_DEF_ERROR_CODE(mod, code)
,用于生成一个32位有符号整数(int32_t
)形式的错误码。其核心逻辑是通过位运算将模块标识符(mod
)和具体错误码(code
)组合成一个唯一的错误码值。以下是逐步解析:
-
宏结构
• 宏名:TAOS_DEF_ERROR_CODE
,接受两个参数mod
(模块标识符)和code
(具体错误码)。• 最终生成的错误码类型为
int32_t
(32位有符号整数)。 -
位运算逻辑
•0x80000000
:十六进制常量,二进制为10000000 00000000 00000000 00000000
,表示最高位(符号位)为1,确保生成的错误码为负数(通常用于标识错误状态)。•
(mod) << 16
:将模块标识符mod
左移16位,使其占据第16~31位(共16位)。例如,若mod = 0x01
,左移后为0x00010000
。•
(code)
:直接使用code
的值,占据低16位(第0~15位)。• 通过按位或运算
|
将三部分合并:错误码 = 0 x 80000000 ∣ ( mod ≪ 16 ) ∣ code \text{错误码} = 0x80000000 \, | \, (\text{mod} \ll 16) \, | \, \text{code} 错误码=0x80000000∣(mod≪16)∣code
-
示例
假设mod = 0x01
,code = 0x0A
,则:
•0x80000000 | (0x01 << 16) | 0x0A
• 等价于
0x80000000 | 0x00010000 | 0x0000000A
• 结果为
0x8001000A
(十进制值-2147416054
)。 -
应用场景
• 这种设计常用于系统或库中,通过模块标识符和错误码的组合,快速定位错误来源。例如:◦ 模块A(
mod = 0x01
)的错误码0x0A
会被编码为0x8001000A
。◦ 模块B(
mod = 0x02
)的错误码0x0A
则为0x8002000A
,避免冲突。 -
注意事项
• 参数范围:mod
和code
需确保在合法范围内(如mod
不超过16位,code
不超过16位),否则可能导致位溢出。• 符号位:最高位固定为1,生成的错误码始终为负数,符合许多系统将负数作为错误码的惯例。
参考类似位操作宏的实现逻辑,这种设计在嵌入式或系统编程中常见,用于高效编码和解码错误信息。