va_start、va_end、va_list的使用

谷粒商城学习笔记-15-数据库初始化 这一节的主要内容是把创建对应的数据库和数据库表。 阅读详情
 

1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表
void foo(...);
void
foo(parm_list,...);

 

2:函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:
#include
<iostream>
void fun(int a, ...)
{
int *temp =
&a;
temp++;
for (int i = 0; i < a; ++i)
{
cout << *temp
<< endl;
temp++;
}
}

 

int main()
{
int a = 1;
int b = 2;
int c = 3;
int d =
4;
fun(4, a, b, c, d);
system("pause");
return
0;
}
Output::
1
2
3
4

 

3:获取省略号指定的参数
在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。像这段代码:
void
TestFun(char* pszDest, int DestLen, const char* pszFormat, ...)
{
va_list
args;
va_start(args,
pszFormat);
_vsnprintf(pszDest, DestLen, pszFormat,
args);
va_end(args);
}

 

4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。

 

  1).演示如何使用参数个数可变的函数,采用ANSI标准形式
  #include 〈stdio.h〉
  #include
〈string.h〉
  #include 〈stdarg.h〉
  
  int demo( char, ... );
  void
main( void )
  {
     demo("DEMO", "This", "is", "a", "demo!",
"");
  }
  
  int demo( char msg, ...
)
  {
      
     va_list
argp;
     int argno = 0;
     char para;

 

    
     va_start( argp, msg
);
     while (1)
      
{
      para = va_arg( argp,
char);
         if ( strcmp( para, "") == 0
)
      
break;
         printf("Parameter #%d is:
%s\n", argno, para);
         argno++;
  
}
   va_end( argp );
  
   return 0;
  }

 

2)//示例代码1:可变参数函数的使用
#include "stdio.h"
#include "stdarg.h"
void
simple_va_fun(int start, ...)
{
    va_list
arg_ptr;
   int nArgValue =start;
    int
nArgCout=0;     //可变参数的数目
    va_start(arg_ptr,start);
//以固定参数的地址为起点确定变参的内存起始地址。
    do
   
{
       
++nArgCout;
        printf("the %d th arg:
%d\n",nArgCout,nArgValue);    
//输出各参数的值
        nArgValue =
va_arg(arg_ptr,int);                     
//得到下一个可变参数的值
    } while(nArgValue !=
-1);               
   
return;
}
int main(int argc, char* argv[])
{
   
simple_va_fun(100,-1);
   
simple_va_fun(100,200,-1);
    return 0;
}

 

3)//示例代码2:扩展——自己实现简单的可变参数的函数。
下面是一个简单的printf函数的实现,参考了<The C Programming
Language>中的例子
#include "stdio.h"
#include "stdlib.h"
void
myprintf(char* fmt, ...)       
//一个简单的类似于printf的实现,//参数必须都是int 类型
{
    char*
pArg=NULL;              
//等价于原来的va_list
    char
c;
   
    pArg = (char*)
&fmt;          //注意不要写成p = fmt
!!因为这里要对//参数取址,而不是取值
    pArg +=
sizeof(fmt);         //等价于原来的va_start         

   
do

 {
        c =*fmt;
        if (c != "%')   
{
           
putchar(c);           
//照原样输出字符
       
}
       
else
       
{
          
//按格式字符输出数据
          
switch(*++fmt)
          
{
           
case'd':
               
printf("%d",*((int*)pArg));          
               
break;
           
case'x':
               
printf("%#x",*((int*)pArg));
               
break;
           
default:
               
break;
           
}
            pArg +=
sizeof(int);              
//等价于原来的va_arg
       
}
  ++fmt;

}while (*fmt != '\0');
    pArg =NULL;                              
//等价于va_end
    return;
}
int main(int argc, char* argv[])
{
    int i = 1234;
    int j =
5678;
   
    myprintf("the first
test:i=%d\n",i,j);
    myprintf("the secend test:i=%d;
%x;j=%d;\n",i,0xabcd,j);
   
system("pause");
    return 0;
}

必看!wechat-article-exporter:轻松批量下载公众号文章 微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。 阅读详情

相关推荐

EndNote全文检索实战:如何快速配置学校图书馆资源并精准查找文献

本文详细介绍了EndNote全文检索功能的实战配置方法,核心在于通过正确设置OpenURL链接解析器,无缝对接学校图书馆资源,实现一键精准获取文献全文。文章提供了从理解机制、四步配置法到进阶技巧的完整指南,帮助科研人员高效管理海量PDF,构建个人知识体系,大幅提升文献调研与写作效率。

weixin_29228781的博客 233

可变参数列表中获取参数,举例说明C语言中va_listva_startvasprintf的用法

va_listva_startvasprintf 通常在 C 语言中一起使用,以处理可变数量的参数并构建字符串。vasprintf 是一个函数,它使用 va_listva_start 来从可变参数列表中获取参数,并创建一个格式化字符串,然后将该字符串存储在动态分配的内存中。***如果打算将字符串存储在某个地方以供将来使用,请确保在适当的时候释放它。vasprintf 根据 fmt 和 args 中的参数来构造字符串,并分配足够的内存来存储它。使用 va_end 清理 va_list 对象。

slty_123的博客 684

【Simulink教程案例19】基于simulink的扩频通信系统建模与仿真

扩频是一种应用于数字调制信号的调制技术,可以提高传输信号的带宽。扩频通信具有抗干扰能力强,扩频增益越大,抗干扰能力越强。而且扩频通信具有很强的保密性,扩频后信号近似白噪声,功率谱密度也很低。扩频通信可用于多址通信。扩频调制有如下三个特点:① 扩频后信号的带宽远大于信号所需的带宽② 使用扩频码进行扩频调制,扩频码与信号中的数据相互独立③ 在接收端,通过将接收信号与扩频码的同步副本进行相关,实现解扩。

FPGA/MATLAB学习教程/源码/项目合作开发 2169

C语言 va_list获取参数列表原理

va_list获取参数列表的原理进行了简单的讲解

Xd19991216的博客 884

va_list 详解

VA_LIST 是在C语言中解决变参问题的一组宏 他有这么几个成员: 1) va_list型变量: #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first homed integer argument */ int offset; /* byte offset of next param

Balder~专栏 970

va_listva_startva_arg 和 va_end的含义和用法

这些宏提供了一种在函数中处理可变数量参数的方式,通常用于实现变参函数(variadic functions)。是一个类型,通常是一个指向可变参数列表的指针。你可以使用它来访问可变参数的内容。是C/C++中用于处理可变参数的一种机制,通常与相关的宏一起使用,如。宏用于结束对可变参数的访问,并且通常放在函数的最后。宏用于从可变参数列表中获取参数的值。和相关宏来接受可变数量的整数参数,然后计算它们的总和。对象,第二个是要获取的参数的类型。对象,第二个是最后一个非可变参数。,你可以逐个获取可变参数的值。

qq_38409301的博客 1089

va_listva_startva_arg、 va_end 使用说明

在ANSI C中,这些宏的定义位于stdarg.h中: typedef char *va_list; va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数): #define va_start(list,param1)   ( list = (va_list)&amp;param1+ sizeof(param1) )...

3万+

list初始化赋值_va_listva_startva_end使用

va_listva_startva_end使用我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:typedef char *va_list;va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_li...

weixin_39836063的博客 1414

详细介绍关于宏va_list ,va_start ,va_arg ,va_end使用

之前在查阅资料时一直没有找到一个完整的介绍这些宏的文章,故根据自己的理解整理了一下。va_list ,va_start ,va_arg ,va_end是C中stdarg.h头文件里面的宏,它们主要用于配合处理一组可变参数,这组可变参数的数量无需提前确定,用起来十分灵活。

zhibaishouhei927的博客 1319

va_startva_arg、va_endva_list使用

VA_LIST 是在C语言中解决变参问题的一组宏 他有这么几个成员: 1) va_list型变量: #ifdef  _M_ALPHAtypedef struct {        char *a0;       /* pointer to first homed integer argument */        int offset;     /* byte offset of next

cactusz的博客 395

va_list/va_start/va_end/va_arg可变参数的使用

做日志打印或其它可变参数处理时,通常我们会想到使用va_list/va_start/va_end做可变参数的收集和处理。使用这种方式处理可变参数比较通用,同时适用于c与c++中。

春夜喜雨的专栏 1684

va_listva_startva_arg、va_end宏的使用(转)

当你的函数的参数个数不确定时,就可以使用上述宏进行动态处理,这无疑为你的程序增加了灵活性。Example:CString AppendString(CString str1,...)//一个连接字符串的函数,参数个数可以动态变化{      LPCTSTR str=str1;//str需为指针类型,因为va_arg宏返回的是你的参数的指针,但是如果你的参数为int等简           

坚持,才是力量.老实做人,踏实做事. 3870

va_list,va_start,va_arg,va_copy和va_end使用

va_list arg_ptr:定义一个指向个数可变的参数列表指针; va_start(arg_ptr, argN):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,说明:argN是位于第一个可选参数之前的固定参数,(或者说,最后一个固定参数;…之前的一个参数),函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。如果有一va函数的声明是void va_test(

garygeeker的专栏 2438

va_listva_startva_end使用

我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍为了理解这些宏的作用,我们必须先搞清楚:C语言中函数参数的内存布局。首先,函数参数是存储在栈中的,函数参数从右往左依次入栈。

木牛的博客 1913

清空list_va_listva_startva_end使用

va_listva_startva_end使用我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:typedef char *va_list;va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_li...

weixin_30920223的博客 151

大量的HHCTRL(id=1903)事件--与TightVNC有关

有时计算机应用程序事件日志不停地出现大量的 HHCTRL id=1903 的事件:事件 ID ( 1903 )的描述(在资源( HHCTRL )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远端计算机显示...

561

【转】va_listva_startva_arg、va_end的原理与使用

概述 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论. 定义 大家先看几宏. 在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义: #define...

weixin_30699741的博客 172

va_listva_startva_arg、va_end用法

是一个类型,用于表示一个可变参数列表。在C语言中,这个类型通常是一个指向参数的指针,或者是一个封装了这种指针的结构体,具体实现依赖于编译器。有两个参数,第一个参数是va_list类型的变量,第二个参数是最后一个固定参数的名称(最后一个在函数声明中有明确名称的参数)只需要一个参数,就是之前通过va_start初始化的va_list类型的变量。,用于初始化va_list类型的变量,使其指向可变参数列表的第一个参数。,用于结束对可变参数列表的处理,并清理va_list类型的变量。

qq_42757463的博客 1114

va_listva_startva_end的用法

在项目的代码中看到函数不定参数的使用,现在总结一下va_listva_startva_end三个宏的用法。 c语言提供了函数的不定长参数使用,比如 void func(int a, …)。三个省略号,表示了不定长参数。注意:c标准规定了,函数必须至少有一个明确定义的参数,因此,省略号前面必须有至少一个参数。 va_list宏定义了一个指针类型,这个指针类型指向参数列表中的参数。 void va...

hust_joker的博客 1万+

锅炉烟气脱硫塔设计计算电子表.zip

锅炉烟气脱硫塔设计计算电子表

工程车检测数据集,10111张原始图片,支持pasical voc 格式标注,可识识别水泥卡车,空载的自卸卡车,载物的自卸卡车,挖掘机,装载机

工程车检测数据集,10111张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注,可识识别水泥卡车,空载的自卸卡车,载物的自卸卡车,挖掘机,装载机 ,标注信息和图片可以访问博文: https://backend.blog.csdn.net/article/details/145203317

上一篇: Peercast简介、分析及常见问题处理(二)
下一篇: 函数参数入栈的方式__stdcall等
Canvas
博客等级 码龄16年 4粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值