函数的可选性自变量 

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语言函数的可选性自变量的更多相关文章

  1. c语言函数的可选性自变量

    功能: 宏va_arg()用于给函数传递可变长度的参数列表. 首先,必须调用va_start() 传递有效的参数列表va_list和函数强制的第一个参数.第一个参数代表将要传递的参数的个数. 其次,调 ...

  2. keil or c51 汇编调用c语言函数 容易忽视的问题

    最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

  3. Go 语言函数

    函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. ...

  4. Go语言函数

    目录 函数定义 函数返回多个值 函数参数 Go 语言函数值传递 Go语言函数引用传递 函数用法 函数作为值 匿名函数 闭包 方法 不定参数的函数 init函数 内建函数 函数调用机制 总结 函数定义 ...

  5. GO语言学习(十二)Go 语言函数

    Go 语言函数 函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回 ...

  6. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  7. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  8. C语言函数sscanf()的用法

    从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...

  9. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

随机推荐

  1. MySQL 实现row_number() 分组排序功能

    数据库基本脚本 CREATE TABLE `a` ( `ID` INT(10) NULL DEFAULT NULL, `class` INT(10) NULL DEFAULT NULL, `score ...

  2. oracle查询某个时间点的数据

    1. select * from emps as of timestamp to_Date('2015-12-11 14:00:00','yyyy-mm-dd hh24:mi:ss'),SQL语句是查 ...

  3. web前端程序员真的值这么多钱吗?

    对于互联网公司来说用户就是上帝,做好客户体验一切才有可能.所以互联网公司都会把钱砸向前端,Web前端程序员也越来越受到企业争相聘用. 前端工程师工资也越来越高,目前Web前端工程师工作1~2年后通常会 ...

  4. Object转数组

    int length = Array.getLength(value);String[] newarray = new String[length];for (int i = 0; i < le ...

  5. UE4入门与精通

    由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...

  6. cs

    cs <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  7. 下载VM12 虚拟机和安装kali

    为什么现在才写这个--  因为我在学校啊,学校的电脑还没有kali.好了我们开始. http://www.vmware.com/products/player/playerpro-evaluation ...

  8. eclipse自动补全快捷键失效,sysout用不了!

    好久没写Java代码了,使用新版Neon的Eclipse Java EE IDE开发时,自动补全各种失败,sysout也各种用不了, 开始还以为是电脑卡比呢,原来是版本的快捷键不同了,修改方法如下! ...

  9. WIN10 多用户登录

    WIN10 多用户登录 参考下面链接 http://www.mysysadmintips.com/windows/clients/545-multiple-rdp-remote-desktop-ses ...

  10. 【皇甫】☀初识AOP

    新知识,新起点,下面介绍一下aop所要准备架包和各个层 特点: 创建好的各个层: 所需架包: 具体步骤: No.1  搭建分层架构 entity 1 public class User impleme ...