如何定义宏定义 不定参数数函数

Lua不定参数函数定义及调用
作为Lua中强大的功能之一,不定参数,在不同Lua版本中使用的方法并不一致,我使用的是Lua5.1,Lua5.2也应该是通用的。
不定参数函数定义:
MainScene:lookTable(...)
local args = {...}
in ipairs(args) do
& print(n.."&&&&&&"..m)
in ipairs({...}) do
& print(n.."--------"..m)
lookTable(1,2,3,4,5)
打印结果:
[LUA-print] 1&&&&&&1
[LUA-print] 2&&&&&&2
[LUA-print] 3&&&&&&3
[LUA-print] 4&&&&&&4
[LUA-print] 5&&&&&&5
[LUA-print] 1--------1
[LUA-print] 2--------2
[LUA-print] 3--------3
[LUA-print] 4--------4
[LUA-print] 5--------5
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何给一个不定参数函数做宏定义?
[问题点数:20分,结帖人cl]
如何给一个不定参数函数做宏定义?
[问题点数:20分,结帖人cl]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!研究试验5函数如何接收不定数量的参数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
研究试验5函数如何接收不定数量的参数
上传于||文档简介
&&汇​编​语​言​实​验​5
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
你可能喜欢C语言可变参数函数详解示例
字体:[ ] 类型:转载 时间:
一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数。但在某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。典型的可变参数函数的例子有printf()、scanf()等,下面我就开始讲解
先看代码 代码如下:printf(“hello,world!”);其参数个数为1个。printf(“a=%d,b=%s,c=%c”,a,b,c);其参数个数为4个。如何编写可变参数函数呢?我们首先来看看printf函数原型是如何定义的。在linux下,输入man 3 printf,可以看到prinf函数原型如下: 代码如下:SYNOPSIS#include &stdio.h&int printf(const char *format, ...);后面的三个点...表示printf参数个数是不定的.如何实现可变参数函数?2. 编写可变函数准备为了编写可变参数函数,我们通常需要用到&stdarg.h&头文件下定义的以下函数: 代码如下:void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src);其中:va_list是用于存放参数列表的数据结构。va_start函数根据初始化last来初始化参数列表。va_arg函数用于从参数列表中取出一个参数,参数类型由type指定。va_copy函数用于复制参数列表。va_end函数执行清理参数列表的工作。上述函数通常用宏来实现,例如标准ANSI形式下,这些宏的定义是: 代码如下:typedef char * va_ //字符串指针#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )#define va_end(ap) ( ap = (va_list)0 )使用宏_INTSIZEOF是为了按照整数字节对齐指针,因为c调用协议下面,参数入栈都是整数字节(指针或者值)。函数官方说明,如果你看到英文就烦,可以自行忽略以下说明。va_start()&&&&&& The& va_start() macro initializes ap for subsequent use by va_arg() and&&&&&& va_end(), and must be called first.&&&&&& The argument last is the name of the last argument before the& variable&&&&&& argument list, that is, the last argument of which the calling function&&&&&& knows the type.&&&&&& Because the address of this argument may& be& used& in& the& va_start()&&&&&& macro,& it should not be declared as a register variable, or as a func‐&&&&&& tion or an array type.va_arg()&&&&&& The va_arg() macro expands to an expression that has the type and value&&&&&& of& the& next& argument in the call.& The argument ap is the va_list ap&&&&&& initialized by va_start().& Each call to va_arg() modifies ap& so& that&&&&&& the& next& call returns the next argument.& The argument type is a type&&&&&& name specified so that the type of a pointer to an object that has& the&&&&&& specified type can be obtained simply by adding a * to type.&&&&&& The& first use of the va_arg() macro after that of the va_start() macro&&&&&& returns the argument after last.&& Successive& invocations& return& the&&&&&& values of the remaining arguments.&&&&&& If& there& is& no& next argument, or if type is not compatible with the&&&&&& type of the actual next argument (as promoted according to the& default&&&&&& argument promotions), random errors will occur.&&&&&& If& ap is passed to a function that uses va_arg(ap,type) then the value&&&&&& of ap is undefined after the return of that function.va_end()&&&&&& Each invocation of va_start() must be matched by a corresponding& invo‐&&&&&& cation of va_end() in the same function.& After the call va_end(ap) the&&&&&& variable ap is undefined.& Multiple traversals of the list, each brack‐&&&&&& eted& by va_start() and va_end() are possible.& va_end() may be a macro&&&&&& or a function.GNU给出的一个实例: 代码如下:#include &stdio.h&#include &stdarg.h&voidfoo(char *fmt, ...){& va_&& char c, *s; va_start(ap, fmt); while (*fmt)&&&& switch (*fmt++) {&&&& case 's': /* string */&&&& s = va_arg(ap, char *);&&&&&&&& printf("string %s\n", s);&&&&&&&&&&&& case 'd': /* int */&&&&&&&& d = va_arg(ap, int);&&&&&&&& printf("int %d\n", d);&&&&&&&&&&&& case 'c': /* char *//* need a cast here since va_arg only takes fully promoted types */&&&&&&& c = (char) va_arg(ap, int);&&&&&&& printf("char %c\n", c);&&&&&&&&& }&& va_end(ap);}说明:va_start(ap, fmt);用于根据fmt初始化可变参数列表。va_arg(ap, char *);用于从参数列表中取出一个参数,其中的char *用于指定所取的参数的类型为字符串。每次调用va_arg后,参数列表ap都会被更改,以使得下次调用时能得到下一个参数。va_end(ap);用于对参数列表进行一些清理工作。调用完va_end后,ap便不再有效。以上程序给了我们一个实现printf函数的是思路,即:通过调用va_start函数,来得到参数列表,然后我们一个个取出参数来进行输出即可。3.实例例如:对于printf(“a=%d,b=%s,c=%c”,a,b,c)语句;fmt的值为a=%d,b=%s,c=%c,调用va_start函数将参数a,b,c存入了ap中。注意到:fmt中的%为特殊字符,紧跟%后的参数指明了参数类型.因此我们的简易printf函数如下: 代码如下:#include &stdio.h&#include &stdarg.h&voidmyprintf(char *fmt, ...){& va_&&& & char *s;&& va_start(ap,fmt);& while (*fmt){&  flag=*fmt++;&  if(flag!='%'){&putchar(flag);&  }  flag=*fmt++;//记得后移一位&&& switch (flag)   {    case 's':&s=va_arg(ap,char*);&printf("%s",s);&   case 'd': /* int */&&&&&&&& &d = va_arg(ap, int);&&&&&&&& &printf("%d", d);&&&&&&&& &&&&&    case 'f': /* double*/&&&&&&&& &d = va_arg(ap,double);&&&&&&&& &printf("%d", d);&&&&&&&& &   case 'c': /* char*/&& &c = (char)va_arg(ap,int);&&&&&&& &printf("%c", c);&&&&&&& &   default:&putchar(flag);&  }&& & }& va_end(ap);}int main(){  char str[10]="linuxcode";  int i=1024;  double f=3.1415926;  char c='V';  myprintf("string is:%s,int is:%d,double is:%f,char is :%c",str,i,f,c);}从上面我们可以知道可变参数函数的编写,必须要传入一个参数fmt,用来告诉我们的函数怎样去确定参数的个数。我们的可变参数函数是通过自己解析这个参数来确定函数参数个数的。比如,我们编写一个求和函数,其函数实现如下: 代码如下:int sum(int cnt,...){&&& int sum=0;&&& va_&&& va_start(ap,cnt);for(i=0;i&++i)&sum+=va_arg(ap,int);&&& va_end(ap);}总结一下就是:通过va_start初始化参数列表(也就能得到具体的参数个数了),然后使用va_arg函数从参数列表中取出你想要的参数,最后调用va_end执行清理工作。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 python 函数不定参数 的文章

 

随机推荐