函数的可选性自变量 

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. 转:PostgreSQL Cheat Sheet

    PostgreSQL Cheat Sheet CREATE DATABASE CREATE DATABASE dbName; CREATE TABLE (with auto numbering int ...

  2. PerformSelector

    PerformSelector 1. 执行和取消 //执行 [self performSelector:@selector(showMessage) withObject:nil afterDelay ...

  3. vuejsLearn--- -- 怎么查看、修改、追加数据---->data对象

    实例观察的数据对象.可以用一个新的对象替换.实例代理了它的数据对象的属 我们现在对data2添加几项 使用数组push()追加 但是直接这样不能进行数组操作 var data2 = { city: ' ...

  4. sql存储过程中加引号

    ALTER PROCEDURE [dbo].[SaveTerminaInfo] @TerminaNo NVARCHAR(50), @Name NVARCHAR(50), @Value NVARCHAR ...

  5. spring 另开线程时的注入问题

    spring web项目在启动的时候,就会完成各种组件的注入.在工作的过程中,遇到了这样一个问题: 一个serviceA中要新开一个线程来执行一项任务(假定这个任务是ClassA).ClassA中要用 ...

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

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

  7. LeetCode Remove Element

    原题链接在这里:https://leetcode.com/problems/remove-element/ 题目: Given an array and a value, remove all ins ...

  8. LintCode Longest Common Subsequence

    原题链接在这里:http://www.lintcode.com/en/problem/longest-common-subsequence/ 题目: Given two strings, find t ...

  9. git tag — 标签相关操作

    标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ Git tag # 在控制台打印出当前仓库的所有标签$ git tag -l 'v0.1.*' # 搜索符合模式的标签 打标签 gi ...

  10. AVD之PANIC: Could not open

    1 原因一:因为我们采用的是绝对路径定位,也就是说在环境变量里面把路径写死了,所以安装都不同,路径读不出来. 解决办法:①在环境变量中创建变量名:ANDROID_SDK_HOME,变量值:你当时安装S ...