... (Многоточие)
 
Используется вместо параметра процедуры для передачи переменного числа аргументов, или как верхняя граница в объявлении массива для указания, что количество элементов будет определяться инициализатором.

Синтаксис

Declare { Sub | Function } proc_name cdecl ( param As datatype, ... )

Dim array_symbol ([lbound To] ...) [As datatype] => { expression_list }

#define identifier( [ parameters, ] variadic_parameter... ) body

Описание

Многоточие (три точки, ...) используется для указания списка переменных аргументов в декларации или определении процедуры. Первый аргумент всегда должен быть указан и функция должна вызываться с С конвенцией вызова cdecl. В теле процедуры, va_first, va_arg и va_next используются для обработки переменных аргументов.
В качестве параметров поддерживаются только числовые типы и указатели. String(строки) могут передаваться, в этом случае ZString Ptr на строковые данные берется.

При использовании многоточия вместо верхней границы в объявлении массива, верхняя граница устанавливается в соответствии с данными, которые появятся в expression_list. Когда многоточие используется таким образом, инициализатор обязателен, и не может быть Any.

Использование многоточия в последнем параметре в декларации #define или #macro позволяет создать вариативный макрос. Это означает, что можно передать любое количество аргументов variadic_parameter, который может использоваться в теле, как будто это был обычный параметр макроса. variadic_parameter будет расширяться и полный список аргументов, передаваемых ей, включая запятые , также может быть совершенно пустым.

Пример

Declare Function foo cdecl (x As Integer, ...) As Integer


Dim As Integer myarray(0 To ...) = {0, 1, 2, 3}
Print LBound(myarray), UBound(myarray)   '' 0, 3


'' Использование вариативного макроса чтобы обернуть вариативную функцию
#include "crt.bi"
#define eprintf(Format, args...) fprintf(stderr, Format, args)
eprintf(!"Hello from printf: %i %s %i\n", 5, "test", 123)

'' LISP-подобный доступ, позволяющий изменять списки разделенные запятыми
#define car(a, b...) a
#define cdr(a, b...) b


Отличия от QB

  • Новое в FreeBASIC

См. также