EOSIO合约新增act6触发constexpr变量必须由常量表达式初始化错误
错误原因
这个报错是EOSIO合约开发中的典型名称规则违例问题:
EOSIO的name类型(包括动作名、账户名)有严格的字符集限制,仅允许使用以下字符:
- 小写字母a-z
- 数字1-5
- 特殊符号
.(点号,不能放在首尾也不能连续出现)
同时长度不能超过12个字符。
你定义act6_action时用的"act6"_n字面量里包含数字6,不在允许的数字范围内,触发了EOSIO内部的字符校验逻辑:eosio::check本身不是constexpr函数,不能在编译期常量表达式里执行,所以直接抛出编译错误。
这也能解释为什么act5可以正常编译:数字5属于允许的1-5范围,没有触发校验逻辑。
可行解决方案
只需要调整动作名字面量为符合EOSIO名称规则的字符串即可,可选方案如下:
- 替换非法数字
6为允许的小写字母即可,示例:
// 把act6的名称改成允许的名字,比如actx、acts都可以,只要不含6及以上的数字 ACTION actx(name nm); using actx_action = action_wrapper<"actx"_n, &project::actx>;
- 如果要保留数字编号逻辑,可以改用1-5范围内的数字组合,或者用全字母拼写数字:
// 例如用全字母拼写数字6 ACTION actsix(name nm); using actsix_action = action_wrapper<"actsix"_n, &project::actsix>;
修改后重新编译即可解决报错。
内容的提问来源于stack exchange,提问作者Arkyris
相关产品推荐
相关产品推荐

