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日

相关文章

  • c# 使用Json.NET实现json序列化

    C# 使用Json.NET实现json序列化 Json.NET是一个第三方的C#库,它可以帮助我们在C#中实现json序列化和反序列化,广泛应用于Web应用程序和移动应用程序的开发中。本文将详细介绍如何使用Json.NET实现json序列化。 步骤1:添加Json.NET库引用 首先,我们需要在C#项目中添加Json.NET库引用。可以通过在Visual S…

    C 2023年5月23日
    00
  • c++11中关于std::thread的join的详解

    简介 在C++11中,我们可以通过std::thread类来创建一个线程。该类提供了与操作系统级别的线程相关的方法,例如创建、销毁、挂起、恢复等。线程的执行中,有可能会出现多个线程共享同一个资源导致的竞争情况,此时,我们就需要对线程进行同步,在正确的时间点上对多个线程进行操作控制。join函数就是一个非常常用的同步方法。 使用方法 join函数用于等待线程的…

    C 2023年5月22日
    00
  • C++中strcpy函数的实现

    C++中的strcpy函数是用于将一个字符串复制到另一个字符串中的函数。其原型为: char *strcpy(char *dest, const char *src); 其中,dest代表目标字符串,src代表源字符串。 以下是strcpy函数的实现过程: 首先判断源字符串和目标字符串是否为 NULL。如果是,则直接返回 NULL。 然后将 src 指针所指…

    C 2023年5月23日
    00
  • Python 对象序列化与反序列化之pickle json详细解析

    Python 对象序列化与反序列化之pickle json详细解析 什么是序列化和反序列化 在计算机科学中,”序列化”是指将数据结构或对象状态转换为可以存储或传输的格式的过程。反之,”反序列化”则是将存储或传输的格式恢复成对象的状态的过程。序列化的一种常见应用是在客户端和服务器之间传输数据。 pickle 序列化和反序列化 Pickle 模块实现了基本的数据…

    C 2023年5月23日
    00
  • C++ 程序员为什么看不起php程序员

    下面是详细讲解“C++ 程序员为什么看不起PHP程序员”的完整攻略: 1. C++ 程序员对 PHP 的不满 1.1 动态类型 C++ 是一门强类型的编程语言,程序员必须显式地声明每一个变量的类型。这也为程序员带来了更高的代码质量和执行效率。而 PHP 是一门弱类型的编程语言,它不强制声明变量的类型,这使得代码难以理解和调试。从此角度来说,C++ 程序员对 …

    C 2023年5月30日
    00
  • C/C++ – 从代码到可执行程序的过程详解

    那我就详细讲解一下C/C++代码从源码到可执行程序的过程,包括编译、链接和生成可执行文件的流程。具体的攻略如下: 一、编译过程 1. 预处理器(Preprocessor) 编译指令 gcc -E main.c -o main.i 或 g++ -E main.cpp -o main.i 将源代码文件 main.c 或 main.cpp 放入预处理器,对含有 #…

    C 2023年5月23日
    00
  • Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 介绍 本文是对Linux下C语言的几道经典面试题进行的总结与分享。在C语言面试中,几道经典的问题一般都是用来测试面试者的基础知识和实际操作能力。在此处,将讨论面试中可能出现的几道经典问题,并提供相应答案和解释。本文将涵盖以下几个部分: 基本数据类型 数组和字符串 指针和内存 函数和指针 基本数据类型 问题1:s…

    C 2023年5月23日
    00
  • 到底如何呢?富士康Ligtning&USB-C数据线测评

    制定测试方案 在进行富士康Ligtning&USB-C数据线的测评之前,需要制定测试方案。主要需要测试以下几点: 兼容性 传输速度 做工质量 安全性能 兼容性测试 取一个iOS设备,如iPhone,连接富士康Ligtning&USB-C数据线,测试手机是否能够正常充电和传输数据。同样的,取一个安卓设备连接USB-C接口进行测试,检查是否能正常…

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