[ASM C/C++] C语言函数的可选性自变量
函数的可选性自变量
C语言允许定义自变量数量可变的函数,称为variadic函数。variadic函数需要固定数目的强制性自变量,后面是数量可变的可选性自变量。
也就是说必须至少有一个强制性自变量。
variadic 可变参数数量有前面的强制性自变量决定,或者有定义可选性自变量列表的特殊值决定。
经典的函数是printf 和 scanf,这两个是通过格式化字符串来提取可变参数的数量的。
定义:
void test(int count, ...)
编写variadic函数时,必须用va_list类型定义自变量指针,来在存取可选性自变量。
可以用 stdarg.h 头文件中的四个宏来处理自变量指针。
void va_start( va_list argptr, lastparam );
开始使用可选性自变量之前,先调用此宏来初始化。
使用第一个可选性自变量的位置来初始化argptr指针,第二个参数为函数的最后一个有名称参数。
void va_arg( va_list argptr, type );
取可选性自变量,并前移指针。type为可刚刚读入的自变量类型。
void va_end( va_list argptr );
不再需要自变量指针时,调用va_end. 使用va_start 或 va_copy 来重新初始化且过的自变量指针,也要先调用va_end。
void va_copy( va_list dest, va_list src);
使用目前的src自变量初始化dest。
#include <stdio.h>
#include <stdarg.h> //可选性自变量函数,count 为数量
void arg_var(char name[], int count, ...)
{
printf("name is: %s \ncount is: %d \n", name, count); va_list argptr; //定义自变量类型
va_start(argptr, count); //初始化自变量
for(int i=; i<count; i++)
{
printf("%s \n", va_arg(argptr, char *)); //取值打印
}
va_end(argptr); //结束使用
} int main(int argc, char * argv[])
{
// call arg_var
arg_var("abeen", , "strarg1", "strarg2", "strarg3");
}
[ASM C/C++] C语言函数的可选性自变量的更多相关文章
- c语言函数的可选性自变量
功能: 宏va_arg()用于给函数传递可变长度的参数列表. 首先,必须调用va_start() 传递有效的参数列表va_list和函数强制的第一个参数.第一个参数代表将要传递的参数的个数. 其次,调 ...
- keil or c51 汇编调用c语言函数 容易忽视的问题
最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...
- Go 语言函数
函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. ...
- Go语言函数
目录 函数定义 函数返回多个值 函数参数 Go 语言函数值传递 Go语言函数引用传递 函数用法 函数作为值 匿名函数 闭包 方法 不定参数的函数 init函数 内建函数 函数调用机制 总结 函数定义 ...
- GO语言学习(十二)Go 语言函数
Go 语言函数 函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回 ...
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
- C语言函数sscanf()的用法
从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...
- 不可或缺 Windows Native (6) - C 语言: 函数
[源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...
随机推荐
- redis3.2新增属性protected mode
在安装新版redis时(3.2) , 一直出现问题 , 只能本机连接其他机器访问失败 , 后来发现是新版增加了安全机制 在配置文件里可以发现多出了protected-mode这一项 , 如果为yes ...
- Glide请求图片能携带Cookie的哟!
在Web编程中我们都很熟知一个概念,当有了seesion登录状态时,你可以访问一些资源但如果你没有登录的话很多资源是无法访问的. 在android的WebApi中当然一样拥有这个概念.比如,用户的头像 ...
- vuejsLearn--- v-for列表渲染
Vue.js是一个构建数据驱动的web界面的库.重点集中在MVVM模式的ViewModel层,因此非常容易与其它库或已有项目整合 Vue.js 的核心是一个响应的数据绑定系统,它让数据与DOM保持同步 ...
- CS193P - 2016年秋 第一讲 课程简介
Stanford 的 CS193P 课程可能是最好的 ios 入门开发视频了.iOS 更新很快,这个课程的最新内容也通常是一年以内发布的. 最新的课程发布于2016年春季.目前可以通过 iTunes ...
- Python之路【第十八章】:Web框架
Web框架本质 1.众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 #!/usr/bin/env python # -*- codin ...
- SVN更新时,校验和不匹配
svn检出时出现校验和不匹配. 解决方法: 1. 在另外地方检出,然后找到对应文件所在的.svn/entries文件,用新检出的entries文件覆盖原来发生错误的entries文件. 2. 如果是团 ...
- PostgreSQL installations
[root@test02 init.d]# ll /etc/init.d/postgresql-9.5 -rwxr-xr-x. 1 root root 10072 May 15 06:34 /etc/ ...
- kindEditor完整认识 PHP上调用并上传图片说明/////////////////////////////z
最近又重新捣鼓了下kindeditor,之前写的一篇文章http://hi.baidu.com/yanghbmail/blog/item/c681be015755160b1d9583e7.html ...
- github Android-Universal-Image-Loader
目存在于Github上面https://github.com/nostra13/Android-Universal-Image-Loader,我们可以先看看这个开源库存在哪些特征 多线程下载图片,图片 ...
- NDK开发-Android Studio+gradle-experimental开发ndk
在最新的Android Studio2.2的preview版中,增加全新的ndk支持,使用了新的gradle,以及DSL语言. 新的NDK需要使用新的Gradle插件和新的Android插件来支持! ...