链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。

源文件可以包含任意数量的合约定义,include指令和pragma伪指令。

Pragma 版本

源文件可以(并且应该)使用所谓的版本编译指示进行注释,以拒绝随后可能引入不兼容更改的编译器版本进行编译。我们尝试将这些更改保持在绝对最小值,尤其是在语义变化也需要更改语法的情况下引入更改,但这并不总是可能的。因此,至少对于包含突破性更改的版本,读取更改日志总是一个好主意,这些版本将始终具有0.x.0或x.0.0格式的版本。

版本pragma使用如下:

pragma solidity ^0.4.0;

这样一个源文件不会使用比版本0.4.0之前的编译器编译,并且它也不会在从0.5.0版本开始的编译器(第二个条件通过使用^添加)起作用。 这个想法是,直到版本0.5.0才会有变化,所以我们可以随时确定我们的代码将按照我们打算的方式进行编译。 我们不会修复编译器的确切版本,因此修补程序版本仍然可能。

可以为编译器版本指定更复杂的规则,表达式遵循由npm使用的规则。

导入其他源文件

语法和语义

Solidity支持与JavaScript中可用的导入语句(来自ES6)的引用语句,尽管Solidity不知道“default export”的概念。

在全局层面,您可以使用以下形式的导入语句:

import “filename”;

此语句从“filename”(以及导入的符号)导入所有全局符号到当前全局范围(与ES6不同,但与Solidity相反)。

import * as symbolName from “filename”;

…创建一个新的全局符号symbolName,其成员都是来自“filename”的全局符号。

import {symbol1 as alias, symbol2} from “filename”;

…创建新的全局符号alias和symbol2,分别从“filename”引用symbol1和symbol2。

另一种语法不是ES6的一部分,但可能很便于:

import “filename” as symbolName;

相当于import * as symbolName from “filename”;

路径

在上文中,文件名始终被视为具有/作为目录分隔符的路径. .作为当前目录和…作为父目录。 当. 或…后跟一个字符,除了/,它不被认为是当前或父目录。 所有路径名称都被视为绝对路径,除非它们以当前的路径开头. 或父目录…

要从与当前文件相同的目录导入文件x,请使用导入“./x”作为x ;. 如果使用导入“x”作为x; 相反,可以引用不同的文件(在全局“包含目录”中)。

这取决于编译器(见下文)如何实际解析路径。一般来说,目录层次结构不需要严格地映射到本地文件系统上,它也可以映射到通过例如文件发现的资源比如ipfs,http或git。

在实际编译器中使用

当调用编译器时,不仅可以指定如何发现路径的第一个元素,而且可以指定路径前缀重新映射,github.com/ethereum/dapp-bin/library被重新映射到/usr/local/dapp-bin/library,编译器将从那里读取文件。 如果可以应用多重重新映射,则首先尝试使用最长密钥。 这允许一个“回退-重新映射”与例如 “”映射到“/usr/local/ include/solidity”。 此外,这些重新映射可以依赖于上下文,它允许您配置包导入例如 不同版本的同名库。

solc:

对于solc(命令行编译器),这些重新映射作为上下文提供:prefix = target参数,其中context和and = target部分都是可选的(在这种情况下,target默认为前缀)。 所有重新映射的值都是常规文件(包括它们的依赖项)。 这个机制是完全向后兼容的(只要没有文件名包含=或:),因此不会发生变化。 导入以前缀开头的文件的目录上下文文件中的所有导入将通过将目标替换为前缀来重定向。

例如,如果您将本地github.com/ethereum/dapp-bin/克隆到/usr/local/ dapp-bin,则可以在源文件中使用以下内容:

import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping;

然后运行编译器

solc github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ source.sol

作为一个更复杂的例子,假设你依靠一些使用非常旧版本的dapp-bin的模块。 在/usr/local/ dapp-bin_old中检出旧版本的dapp-bin,然后可以使用

solc module1:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ \ module2:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin_old/ \ source.sol

所以module2中的所有导入都指向旧版本,但是在module1中导入获取新版本。

请注意,solc仅允许您包含某些目录中的文件:它们必须位于显式指定的源文件之一或重映射目标的目录(或子目录)中的目录(或子目录)中。 如果要允许直接绝对包含,只需添加重新映射=/。

如果存在导致有效文件的多个重新映射,则选择具有最长公共前缀的重映射。

Remix:

Remix为github提供自动重新映射,并且还可以通过网络自动检索文件:您可以通过例如导入迭代映射。

import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping;

其他源代码提供者可能会在将来被添加。

注释

单行注释(//)和多行注释(//)是可行的。

// 单行注释./多行注释/

另外还有另一种类型的评论叫做natspec注释,文档还没有被写入。 它们是用三斜杠(///)或双星号块(/ * … /)编写的,它们应该直接在函数声明或语句上方使用。 您可以在这些注释中使用Doxygen风格的标签来记录功能,注释条件以进行正式验证,并提供确认文本,当用户尝试调用功能时,该文本将显示给用户。

在下面的例子中,我们记录了合同的标题,两个输入参数的说明和两个返回的值。

pragma solidity ^0.4.0;/** @title Shape calculator. /contract shapeCalculator { /* @dev Calculates a rectangle’s surface and perimeter. * @param w Width of the rectangle. * @param h Height of the rectangle. * @return s The calculated surface. * @return p The calculated perimeter. */ function rectangle(uint w, uint h) returns (uint s, uint p) { s = w * h; p = 2 * (w + h); }}

一个Solidity源文件的布局相关推荐

  1. 【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity

    想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 一个Solidity源文件的布局 源文件可以包含任意数量的合约定义,include指令和pragma伪指令. Pra ...

  2. 【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity 1

    索引 [Solidity]1.一个Solidity源文件的布局 [Solidity]2.合约的结构体 [Solidity]3.类型 [Solidity]4.单位和全局可变量 [Solidity]5.表 ...

  3. 【 Linux 】创建一个文件夹并在此文件下创建一个c源文件

    我们需要单独创建一个文件夹来存放自己的文件,例如存放使用vim编写的c源文件,或者一个工程内的所有东西. 我们以在Linux下的home文件夹下创建一个vim文件夹,然后在此文件夹下创建一个c源文件, ...

  4. eclipse新建一个java_Eclipse中新建一个java源文件的步骤

    [简答题]请根据第六次讨论题目进行讨论.并将你的讨论回答的ppt传到此处. [简答题]P152页,习题9 一.二(2,3).请将回答的word文档上传到此处. [简答题]第五次讨论:讨论题目参见课程网 ...

  5. jQuery Masonry 一个 jQuery动态网格布局的插件

    jQuery Masonry 是一个 jQuery动态网格布局的插件. 每个元素都是漂浮在固定的网格布局上面,就像一枚图钉定在墙上一样. 我们发现以下的15网站使用jQuery Masonry的范例. ...

  6. 让一个python源文件也能像bat批处理文件那样运行[转]

    有没有想过让一个python源文件也能像bat批处理文件那样运行?下面给大家演示一下一个小小的trick. ? 1 2 # || cd "%~dp0" && pyt ...

  7. 一个java源文件允许_一个Java源文件中最多只能有一个class定义

    一个Java源文件中最多只能有一个class定义 答:× 确诊甲状腺功能紊乱的常规指标是 答:FT3和FT4 I will not let my children in that way. 答:be ...

  8. [html] 写一个标签云的布局

    [html] 写一个标签云的布局 <ul class="tag-cloud"><li>JavaScript</li><li>技术&l ...

  9. android webview圆角,Android 实现一个通用的圆角布局

    前言 我们在平时的开发中,经常会遇到圆角需求,比如下图 一般的实现方法是上面的图片左上和右上设置圆角,下面的文字部分左下和右下设置圆角,而 Glide 默认是不支持指定位置设置圆角的,需要通过自定义 ...

最新文章

  1. Python:线程之定位与销毁
  2. 废旧光盘手工小制作_[创意手工]废旧光碟手工制作变废为宝
  3. GNS3与SecureCRT关联问题
  4. Mining of Massive Dataset----PageRank的两种问题spider traps和dead ends
  5. android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡
  6. java session 生命周期_Java中httpsession生命周期
  7. java 调制信号,常见调制技术汇总
  8. 离散数学与计算机的发展,计算机学科发展中离散数学的作用与运用
  9. linux系统的wps办公软件,wps32位/64位linux版办公软件-WPS Office 2019 For Linux下载V11.1.0.10161官方版-西西软件下载...
  10. Creo 工程图 尺寸 消失
  11. C语言控制桌面背景图
  12. 网络与信息安全工程师职位要求
  13. 一、用Python从零实现横向联邦图像分类
  14. 百度seo html,百度seo需要什么技术
  15. Java基础面试题/知识点总结
  16. 1024程序员节|基于Springboot实现运动场馆预约信息管理系统
  17. 大数据在电力行业的应用案例100讲(十七)-基于微服务架构的营配贯通设计
  18. spss统计软件分析学习笔记lt;二gt;
  19. 聪明男人和愚蠢男人的区别
  20. 联想拯救者wifi老是掉线_联想拯救者win10系统安装360免费wifi连接手机总是掉线?...

热门文章

  1. python逐个读取文件并处理_逐个读取多个文件并用python进行处理
  2. excel小写转大写公式_【Excel函数贴】五个技巧性函数小套路
  3. CSS之布局(盒子模型--外边距)
  4. etw系统provider事件较多_【Flutter 实战】文件系统目录
  5. 日志服务Flink Connector《支持Exactly Once》
  6. php CI框架输出空行问题排查
  7. Codeforces 846 B Math Show DFS + 贪心
  8. VMware 克隆Linux后找不到eth0
  9. 视音频数据处理入门:RGB、YUV像素数据处理【转】
  10. c3p0数据库连接池使用报错【 You can't operate on a closed Connection!!!】解决方案