C语言的va_list使用方法

news/2024/11/14 12:46:30/

一、定义

在C++中又函数重载功能,C语言中也是又类似功能的,如经常见到的  int fun(char *format, ... ),该函数的参数个数是未定的,以此实现了类似重载的功能,我们用的最多的printf() 函数就是这样实现的,现在来讲讲这个怎么用:
正如大家知道的那样,函数传入的参数是保存在栈中的,第一个参数在栈的最顶端,最后一个参数在栈的最底端,
对于函数void  fun(char *formt,...);进行调用fun("a","b","c","d","e","f","g");
va_list:复合类型,va_list  args;声明变量args,可以看作为一个指针
va_start(args, formt):将args指向第一个参数"a"
va_arg(args, 参数类型):args指向下一个参数
va_end(args):将args置为无效

二、使用

#include <stdarg.h>
#include <iostream>void fun(int a,...)
{va_list pp;int n=1;va_start(pp,a);do{printf("第 %d 个参数 =%d\n",n++,a);a=va_arg(pp,int);}while (a!=0);va_end(pp);
}int main()
{fun(20,40,60,80,0);return 0;
}

 VA_LIST的用法: 
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针; 
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量; 
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数); 
(4)最后用VA_END宏结束可变参数的获取。

参考:

va_start()va_end()和vsnprintf()函数应用_算法随笔-CSDN博客

va_list使用方法_一个菜鸟-CSDN博客_va_list


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

相关文章

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: 检测到 …

va_list分析

typedef char* va_list INTSIZEOF 宏,获取类型占用的空间长度&#xff0c;最小占用长度为int的整数倍&#xff1a; #define _INTSIZEOF(n) ( (sizeof(n) sizeof(int) - 1) & ~(sizeof(int) - 1) ) VA_START宏&#xff0c;获取可变参数列表的第一个参数的地址&#xff08…

va_start和va_end使用详解

转载于&#xff1a;http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏&#xff0c;但对它们也只是泛泛的了解。 介绍这两个宏之前先…

va_list介绍

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