格式、缩进和空格
MQL5 是一种所谓的自由格式语言,例如类 C 语言和多种其他语言。这意味着,只要遵循语法规则,则可以服务符号(如括号或运算符)和关键字可以随机放置。语法只限制这些符号和字的相互顺序,而每个字符串开头的缩进大小或语句元素之间的空格数对编译器没有任何意义。在文本中需插入空格来分隔语言元素(比如变量类型关键字和变量标识符)的位置,都可以使用大量的空格。此外,除了空格,还允许使用其他表示空白的符号,比如制表符和换行符。
如果在语句的一些元素之间有一个分隔符号(我们将在第二章学习),比如在函数参数之间有一个逗号 ',',则无需使用任何空格。
对源代码格式的更改不会修改可执行代码。
总的来说,有许多非自由格式的语言。在某些非自由格式的语言中,代码块的形成(在 MQL5 中使用花括号匹配来实现)依赖于与左边缘的等距缩进。
由于格式自由,MQL5 允许程序员使用多种不同的技术来形成源代码,以提高其可读性、可视性和内部导航便利性。
让我们分析一些例子,看看如何从我们的脚本中记录 Greeting 函数的源文本,而不改变它的意图。
这是最“紧凑”的版本,没有任何多余的空格或换行符(此处添加的表示换行符的符号 '\' 仅为遵守本书对发布源代码的限制)。
string Greeting(int hour){string messages[3]={"Good morning",\
|
此处的版本中插入了过多的空格和换行符。
string
|
MetaEditor 具有一个内置的代码样式器,可按照支持的一种样式,自动设置当前文件的源代码格式。可以在工具 -> 设置 -> 样式器对话框中选择特定的样式。使用工具 -> 样式器命令应用样式。
应谨记,您的空间自由是有限的。特别是,您不能在标识符、关键字或数字中插入空格。否则,编译器将无法识别它们。例如,如果我们在数字 24 中的数字 2 和 4 之间插入一个空格,编译器尝试编译脚本时会发生大量错误。
以下是一个被故意错误修改的字符串:
return messages[hour % 2 4 / 8]; |
以下是错误日志:
'GoodTime2.mq5' GoodTime2.mq5 1 1
|
编译器消息未必总是清晰易懂。需要注意的是,即使出现第一个(连续)错误时,程序的内部表示(如编译器中途对程序的理解)很可能与程序员的意图大相径庭。特别是,在这种情况下,只有前两条错误包含理解问题的关键,而所有其他错误都属于连带错误。
根据第一个错误,编译器期望找到 2 和 4 之间的运算符号(因为它认为 2 和 4 是两个不同的数字,而不是由空格分隔的数字 24)。另一种逻辑是,这里省略了一个右方括号,因此编译器显示了第二个错误:"'[' - unbalanced left parenthesis."运行后,整个表达式被完全打乱,因此编译器认为后面的数字 8 和右括号 ']' 似乎不合适。但实际上,我们只用删除 2 和 4 之间多余的空格,情况就会变得正常。
当然,在我们刻意制造问题的情况下,进行这样的错误分析十分容易。而在实践中,我们不一定清楚如何修复各种错误。即使在上面的例子中,假设您从另一个程序员那里收到了这段不完整的代码,并且数组元素不包含此类琐碎信息,那么您会考虑其他修改方法:必须留下 2 或 4,因为作者可能希望用一个数字替换另一个数字,而没有清除“足迹”。