当前位置: 首页 > 编程日记 > 正文

va_start() va_end()函数应用

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

2:函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:
 1 #include <iostream>  
 2 void fun(int a, 
 3 
 4 int *temp = &a; 
 5 temp++
 6 for (int i = 0; i < a; ++i) 
 7 
 8 cout << *temp << endl; 
 9 temp++
10 
11 
12 
13 int main() 
14 
15 int a = 1
16 int b = 2
17 int c = 3
18 int d = 4
19 fun(4, a, b, c, d); 
20 system("pause"); 
21 return 0
22 

Output:: 



4

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

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

1).演示如何使用参数个数可变的函数,采用ANSI标准形式 
 1 #include 〈stdio.h〉 
 2   #include 〈string.h〉 
 3   #include 〈stdarg.h〉 
 4   /*函数原型声明,至少需要一个确定的参数,注意括号内的省略号*/ 
 5   int demo( char ); 
 6   void main( void ) 
 7   { 
 8    demo("DEMO""This""is""a""demo!"""); 
 9   } 
10   /*ANSI标准形式的声明方式,括号内的省略号表示可选参数*/ 
11   int demo( char �msg,  ) 
12   { 
13   /*定义保存函数参数的结构*/
14    va_list argp; 
15    int argno = 0;  
16    char para; 
17 
18    /*argp指向传入的第一个可选参数,msg是最后一个确定的参数*/ 
19    va_start( argp, msg ); 
20    while (1
21   { 
22    para = va_arg( argp, char); 
23    if ( strcmp( para, ""== 0 ) 
24   break
25    printf("Parameter #%d is: %s\n", argno, para); 
26    argno++
27    } 
28    va_end( argp ); 
29    /*将argp置为NULL*/
30    return 0
31   } 

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


3)//示例代码2:扩展——自己实现简单的可变参数的函数。
下面是一个简单的printf函数的实现,参考了<The C Programming Language>中的例子
 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 void myprintf(char* fmt, //一个简单的类似于printf的实现,//参数必须都是int 类型
 4 
 5   char* pArg=NULL; //等价于原来的va_list 
 6   char c;
 7    
 8   pArg = (char*&fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值
 9   pArg += sizeof(fmt); //等价于原来的va_start  
10  
11   do
12   {
13   c =*fmt;
14   if (c != '%')
15   {
16   putchar(c); //照原样输出字符
17   }
18   else
19   {
20   //按格式字符输出数据
21   switch(*++fmt) 
22   {
23   case'd':
24   printf("%d",*((int*)pArg));  
25   break;
26   case'x':
27   printf("%#x",*((int*)pArg));
28   break;
29   default:
30   break;
31   } 
32   pArg += sizeof(int); //等价于原来的va_arg
33   }
34   ++fmt;
35   }while (*fmt != '\0'); 
36   pArg = NULL; //等价于va_end
37   return
38 }
39 int main(int argc, char* argv[])
40 {
41   int i = 1234;
42   int j = 5678;
43    
44   myprintf("the first test:i=%d\n",i,j); 
45   myprintf("the secend test:i=%d; %x;j=%d;\n",i,0xabcd,j); 
46   system("pause");
47   return 0;
48 }


转载于:https://www.cnblogs.com/phonefans/archive/2008/12/24/1361635.html

相关文章:

高考估分查分选志愿一键搞定_支付宝又操办了件人生大事

摘要&#xff1a; 可能比高考更考验心力的填报志愿&#xff0c;支付宝要帮你一键搞定。 支付宝今天正式上线集估分、查分、选志愿等众多服务于一体的高考后综合服务平台&#xff0c;陪伴高考学生的青春大考。考生在估分、查分后&#xff0c;还可以看到系统智能推荐供参考的合适…

LSGO:祝大家新年快乐!

2016年&#xff0c;团队做了很多事&#xff0c;有做成的&#xff0c;有没做成的&#xff0c;有正在推进的&#xff0c;有主动放弃的&#xff0c;有做的好的&#xff0c;有做的不好的&#xff0c;但总体上还是做了很多的事情。希望2017年能做更多一点的事情&#xff0c;好的做的…

VMware安装Centos7桌面版超详细图文过程

前提准备&#xff1a; VMware Workstation虚拟机 centos7.4 镜像&#xff08;我下载的DVD版4.1G&#xff09; 打开VM&#xff0c;点击文件->新建虚拟机 不是说你分给虚拟机2G内存&#xff0c;主机就少了2G的内存。比如说假设主机内存为8G&#xff0c;虚拟机关闭的时候&…

关于ASP.NET Web 部件连接的引入

创建用于 ASP.NET 2.0 应用程序的 Web 部件 您可以用两种方法创建 Web 部件。第一种方法涉及创建一个自定义的 Web 部件类&#xff0c;该类从 System.Web.UI.WebControls.WebParts 命名空间中定义的 WebPart 类继承。使用该方法时&#xff0c;将自定义的 Web 部件类打包到一个程…

hive2.1.1安装配置

2019独角兽企业重金招聘Python工程师标准>>> 一、Hive 运行模式 与 Hadoop 类似&#xff0c;Hive 也有 3 种运行模式&#xff1a; 1. 内嵌模式 将元数据保存在本地内嵌的 Derby 数据库中&#xff0c;这是使用 Hive 最简单的方式。但是这种方式缺点也比较明显&am…

高斯消元法对矩阵LU分解的影响

** 欢迎大家到Matlab与线性代数专栏中查看相关图文。 ** 本文详细介绍了Matlab进行lu分解操作时l不为三角形的原理。

Windows10下SSH远程拷贝文件

因为今天需要把服务器上面的东西备份一下&#xff0c;自己平时也在windows下面做的测试&#xff0c;所以用windows在服务器拷贝文件到本地。 首先需要下载一个工具pscp.exe 下载链接 然后再把它移动到这个目录下面就行了 WINR打开命令行 pscp -r 用户名ip:/root/flask E:/refl…

如何在Matlab中获取函数参数的数目?

本图文详细介绍了Matlab中获取函数参数数目的方法。

新站测试中欢迎访问

想买画的可以来看看哦 www.oneartone.com 转载于:https://www.cnblogs.com/liugod/archive/2009/01/04/1368082.html

FTP匿名访问修复方法

window2003 window2008

LeetCode Python题解(一)----双指针法

根据&#xff1a; github优秀创作者. 算法思想 1.双指针法 2.排序 3.贪心思想 4.二分查找 5.分冶 6.搜索 7.动态规划 8.数学 1. 双指针法&#xff1a; 双指针主要用于遍历数组&#xff0c;两个指针指向不同的元素&#xff0c;从而协同完成任务。 1.1 有序数组的 Two Sum 题…

解密淘宝网的开源架构(转)

淘宝网&#xff0c;是一个在线商品数量突破一亿&#xff0c;日均成交额超过两亿元人民币&#xff0c;注册用户接近八千万的大型电子商务网站&#xff0c;是亚洲最大的购物网站。那么对于淘宝网这样大规模的一个网站&#xff0c;我猜想大家一定会非常关心整个网站都采用了什么样…

不上全站https的网站你们就等着被恶心死吧

2019独角兽企业重金招聘Python工程师标准>>> 测试脚本 #!/bin/sh wget \ --user-agent"Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19" \-r \-P a…

《C#精彩实例教程》小组阅读01 – MSDN是什么?

学习编程&#xff0c;特别是在Windows环境下的编程&#xff0c;当我们遇到问题时&#xff0c;最先想到的权威解答机构就是MSDN了。 什么是MSDN呢&#xff1f; MSDN – Microsoft Developer Network 是微软一个期刊产品&#xff0c;专门介绍各种编程技巧。同时它也是独立于Mic…

LeetCode Python题解(二)----排序

根据&#xff1a; githhub优秀创作者. 算法思想 1.双指针法 2.排序 3.贪心思想 4.二分查找 5.分冶 6.搜索 7.动态规划 8.数学 快速排序 用于求解 Kth Element 问题&#xff0c;也就是第 K 个元素的问题。 可以使用快速排序的 partition() 进行实现。需要先打乱数组&#xff…

人生快乐之道(组图)

举报 转载于:https://www.cnblogs.com/qqnnhhbb/articles/1373323.html

Codeforces Round #270

Codeforces Round #270 题目链接 A&#xff1a;我是筛了下素数。事实上偶数仅仅要输出4和x - 4&#xff0c;奇数输出9和x - 9就可以 B&#xff1a;贪心的策略&#xff0c;把时间排序后。取每k个的位置 C&#xff1a;贪心。每次遇到一个人尽量让他用字典序小的&#xff0c;假设不…

Matlab与数据结构 -- 如何获取完整文件名

本图文介绍了Matlab中获取完整文件名的函数fullfile()。

用Git上传删除本地项目到gitlab---图文解析

Git简介 Git是目前世界上最先进的分布式版本控制系统 故事起源&#xff1a;如果你用Microsoft Word写过长篇大论&#xff0c;那你一定有这样的经历&#xff1a; 想删除一个段落&#xff0c;又怕将来想恢复找不回来怎么办&#xff1f;有办法&#xff0c;先把当前文件“另存为……

正常的人|正确的作息时间

正确的作息时间 标签&#xff1a;健康/保健 分类&#xff1a;美容护肤晚上9点——11点为免疫系统&#xff08;淋巴&#xff09;排毒时间。此时间应安静或听音乐 晚间11点——凌晨1点&#xff0c;肝的排毒时间&#xff0c;需在熟睡中进行凌晨1点——3点&#xff0c;胆的排毒时间…

基于Matlab的BP神经网络在语音特征信号识别中的应用

本微信图文详细介绍了BP神经网络在语音特征信号中的应用&#xff0c;并给出了Matlab源码。

DSSM(DEEP STRUCTURED SEMANTIC MODELS)

Huang, Po-Sen, et al. "Learning deep structured semantic models for web search using clickthrough data." Proceedings of the 22nd ACM international conference on Conference on information & knowledge management. ACM, 2013. 该网络把两个不同的输…

TCP和UDP传输特点

1.1TCP传输特点&#xff1a; 端到端通信&#xff1a;客户应用程序在一端&#xff0c;服务器在另一端建立可靠连接&#xff1a;建立连接时会测试网络的连通性可靠交付&#xff1a;建立连接后会发送数据是可靠的&#xff0c;除非因为故障而不能可靠交付&#xff0c;发送方会得到…

css3之 渐变

CSS3 渐变&#xff08;gradients&#xff09;可以让你在两个或多个指定的颜色之间显示平稳的过渡。 以前&#xff0c;你必须使用图像来实现这些效果。但是&#xff0c;通过使用 CSS3 渐变&#xff08;gradients&#xff09;&#xff0c;你可以减少下载的事件和宽带的使用。此外…

CRM:把 isv.config.xml 按钮事件移动到 entity.onload()

大家都知道在ISV.CONFIG里可以添加按钮&#xff0c;然后添加按钮事件&#xff0c;比如下面&#xff1a; <Entities><Entity name"account"><ToolBar ValidForCreate"0"ValidForUpdate"1"><Button Icon"/_imgs/ico_18_…

Matlab与线性代数 -- 均匀分布的随机矩阵

本微信图文详细介绍了Matlab中均匀分布的随机矩阵函数rand、rands、randperm。

pytest实战--参数化parametrize+前置fixture

文章目录参数化 parametrize适用场景一个典型的例子前置fixture参数化适用场景一个典型的例子示例2个人疑问&#xff1f;pytest既可以用来做单元测试&#xff0c;也可以用来做自动化接口测试&#xff0c;pytest可以结合allure生成漂亮的测试报告&#xff0c;经过一段时间的学习…

Matlab与机器学习 -- BP网络神经元上的转移函数

本图文详细介绍了BP神经网络常用的转移函数及其导数&#xff0c;单极性Sigmoid函数&#xff0c;双极性Sigmoid函数&#xff0c;线性函数。

在baidu上找到自己

在baidu上搜了我经常用的用户名&#xff0c;找到了这里&#xff0c;一看都满屋子都是灰尘&#xff0c;我打扫了一下。也清理了自己。发现那时的自己好冲动、好小孩。 其实现在也一样。我不想去否认自己的过去&#xff0c;但也不想公开这段过去。因为它在这个废弃的屋子里很安静…

selenium--iframe之模拟qq空间登录

文章目录前言分析切换iframe前言 我在模拟登录qq的时候&#xff0c;发现无论如何都定位不了qq的“账号密码登录”&#xff0c;怎么都进不去qq的登录页面&#xff0c;如下图所示 分析 打开 https://qzone.qq.com/然后点击二维码登录这块&#xff0c;背景出现了灰色&#xff…