可选参数

MQL5 允许在描述函数时为参数指定默认值。为此,可使用 初始化 语法,即在参数右边( = 符号之后)输入对应类型的字面量。例如:

void function(int value = 0);

调用函数时,可以省略这些参数的自变量。那么它们的值将被设置为默认值。这样的参数称为可选参数。

可选参数必须在参数列表的末尾。也就是说,如果第 i 个参数是用初始化声明的,那么所有后续参数也必须这样。否则,将显示编译错误“参数缺少默认值”。下面的函数说明就有这个问题。

double Largest(const double v1const double v2 = -DBL_MAX,
               const double v3);

提供了两种解决方案:一个是 v3 参数也必须有默认值,一个是 v2 参数必须成为强制参数。

从右向左调用函数时,只能省略可选自变量。即如果函数有两个参数,并且都是可选的,那么在调用时,不能跳过第一个,而且要指定第二个。传递的单个值将与第一个参数匹配,第二个将被视为忽略。即使两个自变量都丢失,仍然需要空的圆括号。

分析寻找三个数中最大值的函数。第一个参数是必选的,后两个是可选的,默认等于 double 类型的最小可能数值。因此,在没有显式传递值的情况下,它们中的每个参数肯定会小于(或者极端情况下,等于)所有其他参数。

double Largest(const double v1const double v2 = -DBL_MAX,
               const double v3 = -DBL_MAX)
{
   return v1 > v2 ? (v1 > v3 ? v1 : v3) : (v2 > v3 ? v2 : v3);
}

以下是调用方法:

Print(Largest(1));       // ok: 1
Print(Largest(0, -2));   // ok: 0
Print(Largest(123)); // ok: 3

利用可选参数,MQL5 在自定义函数中实现了具有可变数量参数的函数概念。

与 C++ 不同,MQL5 不支持使用省略语法来定义具有可变数量参数的函数。同时,MQL5 API 中的某些内置函数在描述时就使用了省略号,同时接受可变数量的任意参数。例如, Print 函数。它的原型是这样的:void Print(argument, ...)。因此,我们可以使用最多 64 个自变量(由逗号分隔,不包括数组)来调用这个函数,这些会在日志中显示。