[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=0; 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", 3, "strarg1", "strarg2", "strarg3");
}
时间: 2024-10-21 10:55:08

[ASM C/C++] C语言函数的可选性自变量的相关文章

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

功能: 宏va_arg()用于给函数传递可变长度的参数列表. 首先,必须调用va_start() 传递有效的参数列表va_list和函数强制的第一个参数.第一个参数代表将要传递的参数的个数. 其次,调用va_arg()传递参数列表va_list 和将被返回的参数的类型.va_arg()的返回值是当前的参数. 再次,对所有的参数重复调用va_arg() 最后,调用va_end()传递va_list对完成后的清除是必须的. 1 #include <stdio.h> 2 #include <s

Go 语言函数

Go 语言函数 函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. Go 语言标准库提供了多种可动用的内置的函数.例如,len() 函数可以接受不同类型参数并返回该类型的长度.如果我们传入的是字符串则返回字符串的长度,如果传入的是数字,则返回数组中包含的函数个数. 函数定义 Go 语言函数定义格式如下: func function_name( [pa

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

c 语言 函数的整理 百度脑图版本

下面整理一下C语言函数的知识点 :使用百度脑图进行整理,详情请看上传的图片: 版权声明:本文为博主原创文章,未经博主允许不得转载.

汇编1 ----C语言函数1

构造以下C程序并在合适位置插入breakpoints 在Visual Studio 2015 CTP6对其反汇编. 下面来分析 z = add(1, 2); 009C170E 6A 02 push 2 ????int z; ????z = add(1, 2); 009C1710 6A 01 push 1 009C1712 E8 8D FA FF FF call 009C11A4 009C1717 83 C4 08 add esp,8 009C171A 89 45 F8 mov dword ptr

(转)如何编写有多个返回值的C语言函数

1引言    笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题.有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值:或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回.这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑

Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言.我自己尝试了下. 最终试验成功了,在此写出与大家分享.期间历经无数错误,无数异常,我不是醉了,而是跪了...好在最后好了. 程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值. 新建两个文件分别为main.s的汇编文件,还有pro.c的C语言函数文件. main.s的代码如下: .section .data a: .int 10 b: .int 20 .section .text .globl ma

C语言函数sscanf()的用法 (转载

在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)

C语言函数sscanf()的用法(转)

转自:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf