大大大菜鸟

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

以前只知道在C#中通过param关键字可以定义参数个数不确定的函数,但是在C语言中如何来实现这种功能呢?

在C中定义一个参数可变的函数可以声明如下:

return_type    methodname(arg_type  v1,...);

在MSDN中有如下一个C的例子:

 

#include <stdio.h>
#include 
<stdarg.h>

void testit ( int i, )
{
   va_list argptr;
   va_start(argptr, i);

   
if ( i == 0 ) {
      
int n = va_arg( argptr, int );
      printf( 
"%d\n", n );
   }
 else {
      
char *= va_arg( argptr, char* );
      printf( 
"%s\n", s);
   }

}


int main()
{
   testit( 
00xFFFFFFFF ); // 1st problem: 0xffffffff is not an int
   testit( 1, NULL );       // 2nd problem: NULL is not a char*
}

要实现c中的可变参数,必须要用到“stdarg.h”中的va_start,va_arg,va_end三个宏,使用方法可以参看上面的例子,但是在使用时有几个要注意的事项:

  • 函数声明中的参数列表至少必须要有一项明确定义的形参!
  • va_start(argptr,i)的第一参数使我们定义的va_list型变量,第二个参数是在函数头部(或者函数声明中)定以的最后一个确定参数的形参名称;
  • 我们没有办法通过预定义的方法来动态的获取函数调用者在调用函数时使用了多少个实参,而只能通过标志来获取调用了多少实参。例如我们熟知的printf函数,他应该就是通过解析格式化字符串来得到用户输入了多少个实参;
  • va_arg(argptr, char * valueType) 的第一个参数是我们定义的va_list型变量,第二个定义的是当前要读取的参数的数据类型,如果我们要读取一个int型,我们可以使用va_arg(argptr,int)来获取我们读取的参数值,而具体的参数类型如何确定,也是要我们自己来做的事情;
  • va_end必须被调用,他应该要释放必要的资源;
  • 对于能够用作可变参数的类型有一些限制,在va_arg中不能使用char,unsigned char或float型的参数。而应该用int代替char,用double代替float;

 


 

 

posted on 2009-05-02 13:40  月蚀之罪  阅读(1630)  评论(0编辑  收藏  举报