Solidity中为何函数内定义public合约数组会触发语法错误
Solidity 编译报错原因分析
核心原因是public这类可见性修饰符的使用范围有严格限制,两段代码的变量声明位置不同,适用的语法规则不同:
- 第一段代码中的
SimpleStorage[] public asd;属于合约状态变量:声明在合约体的直接作用域下,是整个合约共享的存储变量,支持添加public/private/internal/external这类可见性修饰符,编译器会自动为public修饰的状态变量生成对应的公开查询函数,因此编译正常。 - 第二段代码中的
SimpleStorage[] public asd;属于函数局部变量:声明在函数内部,作用域仅局限于当前函数的执行上下文,Solidity语法明确规定局部变量不支持使用可见性修饰符,也没有设置可见性的必要性。因此编译器识别到public关键字时会判定为语法错误,提示本应出现结束变量声明的分号,却出现了不符合语法规则的public关键字。
如果需要在函数内声明SimpleStorage数组类型的局部变量,需要去掉public修饰符,同时指定变量的存储位置,示例写法为SimpleStorage[] memory asd;,如果需要指向已有的状态变量则可使用storage修饰存储位置。
内容的提问来源于stack exchange,提问作者Arvenor
相关产品推荐
相关产品推荐

