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

Protobuf枚举类型异常:赋值后解码始终显示首个枚举值

解决Protobuf枚举类型在PBC库中始终显示默认值的问题

问题根源

不管是Lua还是C语言代码,核心问题都是枚举值的赋值未被正确识别,导致Protobuf自动使用了枚举的默认值(即第一个定义的SendType_None = 0):

  • Lua中PBC库不会自动导出枚举常量为全局变量,SendType_Tag属于未定义变量,实际赋值为nil,触发默认值填充。
  • C语言中大概率是引用枚举常量时的命名错误,比如未使用Protobuf生成代码时的标准前缀。

Lua代码修复方案

直接使用枚举对应的数值,或手动创建枚举映射表来保证可读性:

方案1:直接使用枚举数值

把SendType_Tag替换为对应的数值4:

local msgbase = {
    protoName = "msgDemo1",
    sendType = 4,  -- SendType_Tag对应的枚举值
    roomID = 7777,
}

方案2:手动定义枚举映射表

提前定义枚举常量映射,保留代码可读性:

-- 定义枚举常量映射
local SendType = {
    SendType_None = 0,
    SendType_ALL = 1,
    SendType_Self = 2,
    SendType_Other = 3,
    SendType_Tag = 4,
    SendType_Specific = 5,
}

local msgbase = {
    protoName = "msgDemo1",
    sendType = SendType.SendType_Tag,
    roomID = 7777,
}

C语言代码修复方案

Protobuf生成C代码时,会给枚举值加上枚举名作为前缀,比如你的SendType枚举,生成的常量名是SendType_SendType_Tag(而非直接SendType_Tag):

  1. 确保包含生成的头文件(如net.pb.h)。
  2. 使用正确的枚举常量名赋值:
msgBase msg;
msg.has_protoName = 1;
strcpy(msg.protoName, "msgDemo1");
msg.has_sendType = 1;
msg.sendType = SendType_SendType_Tag;  // 使用生成代码中的正确常量名
msg.has_roomID = 1;
msg.roomID = 7777;

验证方式

修改后重新执行编码、解码流程,sendType会正确显示为SendType_Tag(Lua中显示数值4,C语言中显示对应枚举值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:18