C语言中: va_list 解决变参问题

news/2024/12/22 10:07:21/

 VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数 
——摘自百度百科 
va_list 是一个字符指针,在代码中可以理解为指向当前参数的一个指针,这里有几个与 va_list 相关的常见的函数

void va_start ( va_list ap, param );
//对va_list变量进行初始化,将ap指针指向参数列表中的第一个参数
type va_arg ( va_list ap, type ); 
//获取参数,类型为 type 类型,返回值也为 type 类型
int vsprintf(char *string, char *format, va_list ap);
//将ap(通常是字符串) 按format格式写入字符串string中
void va_end ( va_list ap ); 
//回收ap指针

所以解决变参问题就分为四步:

(1)首先在函数里定义 va_list 型的变量 ap,即指向参数的指针;
(2)然后用 va_start 函数初始化刚定义的 ap 指针;
(3)然后用 va_arg 返回可变的参数即 va_arg(va_list ap, type)
(4)最后用 va_list 回收 va_list 指针

eg.:求多个数的最大值:

code:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int Max(int ss, ...){
    va_list ap;
    int ret = -999999, tmp;
    va_start(ap, ss);
    for(int i=0; i<ss; i++){
        tmp = va_arg(ap, int);
        if(ret < tmp)
            ret = tmp;
    }
    va_end(ap);
    return ret;
}
int main()
{
    int cnt = 5;
    printf("%d\n",Max(cnt, 2, 3, 4, 5, 6));
    return 0;
}


http://www.ppmy.cn/news/222269.html

相关文章

va_list原理及用法

VA_LIST 是在C语言中解决变参问题的一组宏&#xff0c;变参问题是指参数的个数不定&#xff0c;可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应&#xff0c;用起来是很灵活。其中va_list&#x…

d va爬黑板animate_复合绝缘子的爬电距离(注电案例1295)

某500kV架空输线路工程&#xff0c;最高运行电压550kV&#xff0c;导线采用4JL/GIA−500/45&#xff0c;子导线直径30.0mm&#xff0c;导线自重荷载为16.529N/m。基本风速27m/s&#xff0c;设计覆冰10mm。请回答下列问题。 1295&#xff0e;根据以下情况&#xff0c;计算导线悬…

C语言的va_list使用方法

一、定义 在C中又函数重载功能&#xff0c;C语言中也是又类似功能的&#xff0c;如经常见到的 int fun(char *format, ... ),该函数的参数个数是未定的&#xff0c;以此实现了类似重载的功能&#xff0c;我们用的最多的printf() 函数就是这样实现的&#xff0c;现在来讲讲这个…

Linux 下 va_start、va_end 学习及使用

本文主要介绍可变参数 函数的实现方法。 头文件&#xff1a;#include <stdarg.h> 一、函数系列介绍 1、va_start函数 原型&#xff1a;void va_start(va_list ap, last); ap&#xff1a;va_list 类型的变量&#xff0c;指向参数的指针 last&#xff1a;最后一个显式声明…

va_list(可变参数函数的使用)

A_LIST 是在C语言中解决变参问题的一组宏&#xff0c;变参问题是指参数的个数不定&#xff0c;可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应&#xff0c;用起来是很灵活。 va_list 用法示例:…

va_list函数

va_list是用来处理可变参数的&#xff0c;下面看一个示例。 #include "stdarg.h" #include <stdio.h>int test(char* msg, ...);int main() {test("hello", "wolrd",1);return 0; }int test(char* msg, ...) {va_list vaList; //定义一个…

va_start 用法

可以参考&#xff1a;C 标准库 - <stdarg.h> 1. 在C中&#xff0c;当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...);这种方式和我们以前认识的不大一样&#xff0c;但我们要记住这是C中一种传参的形式…

检测到“_CRT_STDIO_ISO_WIDE_SPECIFIERS”的不匹配项

libboost_thread-vc142-mt-x64-1_82.lib(thread.obj) : error LNK2038: 检测到“_CRT_STDIO_ISO_WIDE_SPECIFIERS”的不匹配项: 值“0”不匹配值“1”(AcadStr.obj 中) 1> 正在创建库 x64\Release\ArxDbg.lib 和对象 x64\Release\ArxDbg.exp : fatal error LNK1319: 检测到 …