c 语言 va_list 实现变长参数的例子

C

以下是一个使用 va_list 实现变长参数的例子:

#include <stdio.h>
#include <stdarg.h>

void print_ints(int args, ...) {
    va_list ap;
    va_start(ap, args);
    for (int i = 0; i < args; i++) {
        int num = va_arg(ap, int);
        printf("%d ", num);
    }
    va_end(ap);
}

int main() {
    print_ints(3, 1, 2, 3);
    return 0;
}

该程序定义了一个名为 print_ints 的函数,参数有一个整型 args 和一个变长参数列表 ...。在函数内部我们声明了一个 va_list 类型的变量 ap,并使用 va_start 宏将变长参数列表初始化为 ap。然后使用 va_arg 宏来迭代变长参数列表,每次取出一个 int 类型的值 num 并打印到标准输出。最后用 va_end 宏释放变长参数列表。在 main 函数中我们调用了 print_ints 函数,传入的参数为 3, 1, 2, 3,会输出 1 2 3


cpp 语言折叠表达式实现变长参数的例子

C++

以下是一个使用折叠表达式(fold expression) 实现变长参数的例子:

#include <iostream>

template<typename... Args>
void print(Args... args) {
    (std::cout << ... << args) << std::endl;
}

int main() {
    print(1, 2, "three");
    return 0;
}

该程序定义了一个模板函数 print,参数有一个可变模板参数列表 Args... args。在函数内部我们使用折叠表达式,将所有参数的值依次输出到标准输出流中。在 main 函数中我们调用了 print 函数,并传入了三个参数 1, 2, "three"。该程序会输出以下内容:

12three

其中 1, 2, three 分别对应三个参数的值。折叠表达式 (...) 将多个参数值按照顺序组合在一起,然后使用 << 连接符将它们输出到标准输出流中。最后用 endl 操作符输出一个换行符。


python 语言 pack parmerater 实现变长参数的例子

Python

以下是一个使用 *args**kwargs 实现变长参数的例子:

def print_args(*args, **kwargs):
    print("Positional arguments:")
    for arg in args:
        print(arg)
    print("Keyword arguments:")
    for key, value in kwargs.items():
        print(key, "=", value)

print_args(1, 2, 3, a="four", b="five")

该程序定义了一个名为 print_args 的函数,参数有一个 *args 和一个 **kwargs。其中 *args 表示接收任意数量的位置参数,它会被打包成一个元组;**kwargs 表示接收任意数量的关键字参数,它会被打包成一个字典。在函数内部我们遍历 argskwargs,并将其内容输出到标准输出。在 main 函数中我们调用了 print_args 函数,传入了四个位置参数和两个关键字参数,会输出以下内容: