Solidity构造函数可见性被忽略编译警告如何修复
问题根因
该警告是Solidity版本语法迭代导致的:0.7.0及以上版本的Solidity废弃了构造函数(constructor)的可见性修饰符语法,旧版本中给constructor加public/internal来控制合约是否可部署的规则已经失效,写在constructor后的public修饰符会被编译器直接忽略,因此抛出警告。
修复方案
根据合约的实际定位选择对应处理方式即可:
- 若合约需要正常部署:直接删除constructor后多余的
public修饰符即可,修改后代码如下:
重新编译后警告会直接消失,合约部署、初始化逻辑不受任何影响。constructor(address exampleExternalContractAddress) { exampleExternalContract = ExampleExternalContract(exampleExternalContractAddress); } - 若合约仅作为基类被继承、不需要直接部署:无需给constructor加
internal修饰符,直接在合约声明头部添加abstract关键字标记为抽象合约即可,示例代码:// 标记为抽象合约,无法直接部署,仅可被其他子合约继承 abstract contract YourCustomContract { ExampleExternalContract public exampleExternalContract; constructor(address exampleExternalContractAddress) { exampleExternalContract = ExampleExternalContract(exampleExternalContractAddress); } // 其余合约业务逻辑 }
语法补充说明:Solidity 0.6.x及更早版本中,构造函数可见性承担了合约部署权限控制的作用:
public修饰的构造函数对应可正常部署的合约,internal修饰的构造函数对应不可直接部署的抽象基类;0.7.0版本后该规则正式废弃,编译器仅通过合约是否携带abstract标记判断是否可部署,构造函数上书写的所有可见性修饰符都会被直接忽略,触发编译警告。
内容的提问来源于stack exchange,提问作者Caner Kale
相关产品推荐
相关产品推荐

