Skip to content

... (省略号)


用于代替过程参数以传递可变数量的参数,或作为数组声明中的上界,表示元素数量由初始化器决定。

语法

vb
declare { sub | function } proc_name cdecl ( param_list, ... )  { | [ Byref ] As return_type }

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

dim array_symbol ([lbound to] ...) [as datatype] => { expression_list }

描述

可变参数过程

省略号(三个点,...)在过程声明和定义中用于表示可变参数列表。

至少必须指定一个参数,且过程必须使用 C 调用约定 cdecl

在过程体中,可以使用 cva_list 数据类型和 cva_arg 宏来展开省略号参数(...),以获取传递给可变参数过程的参数值。参数列表一旦通过 cva_start 初始化或通过 cva_copy 复制,就可以传递给接受 cva_list 参数的另一个过程。

在某些目标平台上,为了向后兼容,仍可使用 va_firstva_argva_next 来处理可变参数。

可变参数只支持数值类型和指针(字节和短整数类型的可变参数会隐式转换为整数,单精度浮点数的可变参数会隐式转换为双精度浮点数)。可以传递 String,此时会取字符串数据的 Zstring Ptr

可变参数过程名不能重载。

可变参数宏

#define#macro 声明的最后一个参数后使用省略号,可以创建可变参数宏。这意味着可以向 variadic_parameter 传递任意数量的参数,在 body 中可将其当作普通宏参数使用。variadic_parameter 会展开为传递给它的完整参数列表,包括逗号,也可以完全为空。

注意:要区分 variadic_parameter 传入的不同参数,可以先使用 运算符 # (预处理器字符串化)variadic_parameter 转换为字符串,然后在该字符串(#variadic_parameter)中通过定位分隔符(通常是逗号)来区分每个传入的参数。

数组上界

在数组声明中用省略号代替上界,会根据 expression_list 中的数据来设置上界。以这种方式使用省略号时,必须有初始化器,且不能为 Any

示例

start GeSHi

vb
Declare Function foo CDecl (x As Integer, ...) As Integer

end GeSHi

start GeSHi

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

end GeSHi

start GeSHi

vb
'' Using a variadic macro to wrap a variadic function
#include "crt.bi"
#define eprintf(Format, args...) fprintf(stderr, Format, args)
eprintf(!"Hello from printf: %i %s %i\n", 5, "test", 123)

'' LISP-like accessors allowing to modify comma-separated lists
#define car(a, b...) a
#define cdr(a, b...) b

end GeSHi

与 QB 的区别

  • FreeBASIC 新增

另请参阅

  • cdecl
  • cva_list
  • cva_arg
  • va_arg
  • va_first
  • va_next
  • dim
  • static
  • #define

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系