C 标准库 stdarg.h

C 标准库 stdarg.h 是用于支持变参函数(Variadic functions)的头文件。它提供了实现此类函数的机制,能够让函数在编写时不需要定义参数的数量和类型。

1. va_arg

va_arg 函数用于获取变参函数中指定类型的参数,每次获取一个参数,需要传入该参数类型的 Type,该函数会返回指定类型的值,并通过进一步操作来获取下一个参数值。

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

int sum(int count, ...)
{
    int s = 0;

    va_list args;
    va_start(args, count);

    for (int i = 0; i < count; ++i) {
        int arg = va_arg(args, int);
        s += arg;
    }

    va_end(args);
    return s;
}

int main() 
{
    printf("sum: %d\n", sum(5, 1, 2, 3, 4, 5));
    return 0;
}

以上程序的执行结果为:sum: 15。

在上面的程序中,我们定义了一个包含变参函数 int sum(int count, ...),它的前置参数是整形变量 count。变参使用 ... 表示函数有不定数量的参数。我们可以使用 va_list 定义一个列表,该列表包含所有变量参量的数量和类型信息。通过 va_start 宏定义该变参列表,然后使用 va_arg 获取列表中的值,逐个执行相应计算操作,使用 va_end 结束整个列表操作。

2. va_copy

一个变参列表在程序中仅可使用一次,此后如果需要再使用它,则需要进行复制操作。因此,C 标准库提供了一个宏 va_copy,用于复制一个变参列表。

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

int print_vars(int count, ...)
{
    int s = 0;

    va_list args;
    va_start(args, count);

    va_list copy;
    va_copy(copy, args);

    for (int i = 0; i < count; ++i) {
        int arg = va_arg(args, int);
        printf("%d\n", arg);
    }

    va_end(args);

    printf("\n");

    for (int i = 0; i < count; ++i) {
        int arg = va_arg(copy, int);
        printf("%d\n", arg);
    }

    va_end(copy);
}

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

以上程序的执行结果为:

1
2
3
4

1
2
3
4

在上面的程序中,使用 va_copy 复制变参列表 args,然后使用两个循环分别打印原列表 args 和复制列表 copy 中的所有元素。打印完后,使用 va_end 结束列表处理。

通过上面这两个示例,我们说明了 stdarg.h C 标准库的 va_argva_copy 两个函数的使用方法,以及它们在变参函数中的支持作用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 标准库 stdarg.h - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • Java中利用gson解析Json实例教程

    下面我将为您详细讲解“Java中利用gson解析Json实例教程”的完整攻略。 Java中利用gson解析Json实例教程 什么是gson Gson是Google公司发布的一套Java对象序列化和反序列化库。可以将JSON格式的字符串转换为Java对象,也可以将Java对象转换为JSON格式的字符串。 在Java中使用gson可以方便的进行Json解析,使用…

    C 2023年5月23日
    00
  • C++实现蓝桥杯竞赛题目—搭积木

    C++实现蓝桥杯竞赛题目—搭积木的完整攻略 题目描述 假设你们班有很多童鞋正在参加蓝桥杯竞赛,老师突然想了个好玩的游戏:大家一起来玩搭积木,规则如下:每个学生手里都有 $n$ 个积木,编写程序按照如下规则输出: 第一行输出所有积木的高度和; 第二行将所有积木按高度升序输出; 第三行将所有积木按高度降序输出; 第四行随机输出所有积木。 程序实现 首先,因为…

    C 2023年5月23日
    00
  • Objective-C关键字@property使用原理探究

    Objective-C关键字@property使用原理探究 @property的作用 @property是Objective-C中的关键字,用于声明类的属性(property)。使用@property可以快速地生成访问该属性的getter和setter方法的实现代码。 例如,在一个类中声明一个属性name: @property (nonatomic, cop…

    C 2023年5月22日
    00
  • 用C语言实现简单的计算器功能

    创建计算器的布局 首先,我们需要创建一个简单的图形用户界面(GUI),以便用户可以愉快地使用我们的计算器。这里我们将使用C语言中的一个GUI库——GTK。 示例代码: #include <gtk/gtk.h> int main(int argc, char *argv[]) { //初始化 gtk_init(&argc, &arg…

    C 2023年5月23日
    00
  • C语言中bool变量的深入理解

    下面我来详细讲解“C语言中bool变量的深入理解”: 什么是bool变量? bool变量(布尔变量)是C语言中的一种数据类型,它的取值只有两个:true或false,用于存储逻辑值。 bool变量的定义和声明 在C语言中,使用标准库头文件stdbool.h来定义和声明bool变量。在使用布尔变量之前,必须先声明它们。例如: #include <stdb…

    C 2023年5月23日
    00
  • 替换json对象中的key最佳方案

    为了替换JSON对象中的key,我们可以尝试使用以下方法: 遍历对象并创建新的对象 我们可以遍历JSON对象,对每个键值对进行检查,然后创建一个新的对象来替换旧的对象中的Key。例如在JavaScript中: const oldObj = {"oldKey": "value"}; const newObj = {}; …

    C 2023年5月23日
    00
  • C语言实现代码雨效果

    实现“代码雨效果”可以利用C语言的图形库绘制字符,具体流程如下: 1. 安装图形库 在Linux系统下,可以使用以下命令安装 graphics.h 图形库: sudo apt-get install libncurses5-dev libncursesw5-dev 在Windows系统下,可以安装 Turbo C/C++ 的 IDE 环境,其中包含 coni…

    C 2023年5月23日
    00
  • MySQL数据库恢复(使用mysqlbinlog命令)

    MySQL数据库恢复是重要的运维工作之一。使用mysqlbinlog命令恢复MySQL数据库是一种常见方法。以下是使用mysqlbinlog命令恢复MySQL数据库的完整攻略: 1.备份原始的MySQL数据 在恢复MySQL数据库之前,必须确保已经备份了原始的MySQL数据,以便在恢复失败时能够恢复到原始状态。一般情况下,可以使用mysqldump命令进行备…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部