... (省略号)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDots
- 最后更新: 2021-12-05
用于代替过程参数以传递可变数量的参数,或作为数组声明中的上界,表示元素数量由初始化器决定。
语法
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_first、va_arg 和 va_next 来处理可变参数。
可变参数只支持数值类型和指针(字节和短整数类型的可变参数会隐式转换为整数,单精度浮点数的可变参数会隐式转换为双精度浮点数)。可以传递 String,此时会取字符串数据的 Zstring Ptr。
可变参数过程名不能重载。
可变参数宏
在 #define 或 #macro 声明的最后一个参数后使用省略号,可以创建可变参数宏。这意味着可以向 variadic_parameter 传递任意数量的参数,在 body 中可将其当作普通宏参数使用。variadic_parameter 会展开为传递给它的完整参数列表,包括逗号,也可以完全为空。
注意:要区分 variadic_parameter 传入的不同参数,可以先使用 运算符 # (预处理器字符串化) 将 variadic_parameter 转换为字符串,然后在该字符串(#variadic_parameter)中通过定位分隔符(通常是逗号)来区分每个传入的参数。
数组上界
在数组声明中用省略号代替上界,会根据 expression_list 中的数据来设置上界。以这种方式使用省略号时,必须有初始化器,且不能为 Any。
示例
start GeSHi
Declare Function foo CDecl (x As Integer, ...) As Integerend GeSHi
start GeSHi
Dim As Integer myarray(0 To ...) = {0, 1, 2, 3}
Print LBound(myarray), UBound(myarray) '' 0, 3end GeSHi
start GeSHi
'' 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...) bend GeSHi
与 QB 的区别
- FreeBASIC 新增
另请参阅
cdeclcva_listcva_argva_argva_firstva_nextdimstatic#define
返回 目录