开发工作

实现一个OC的可变参数加法函数

2016-06-29  本文已影响482人  Isy

C函数在程序中用到一下这些宏:

void va_start(va_list arg_ptr, prev_param);

void va_arg(va_list arg_ptr, type);

void va_end(va_list arg_ptr);

va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明va_list类型的一个对象 

va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和va_end使用;

va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;

va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。

我们使用C程序的工具来实现一个OC版本的可变参数函数

#import <Foundation/Foundation.h>

@interface AddVarFun : NSObject

//可变参数的类型须一致

//可变参数,传入的最后一个参数必须为nil

- (int)add:(int)item,...;

#import "AddVarFun"

@implementation AddVarFun

- (int)add:(int)item, ...

{

     va_list list; //定义一个指向个数可变的参数列表的指针

     va_start(list, item); //得到一个可变参数的地址,第一个参数传入列表指针,第二个参数传入函数接收的第一个参数

    int result = 0;

    NSLog(@"第一个参数:%d", item);

    result += item;

    int arg; //声明一个中间值,用来接收遍历可变参数列表时,取出的参数

   while ((arg = va_arg(list, int))) { //得到列表中的下一个参数,第一个参数传入列表指针,第二个参数为此函数可变参数的类型。

   //循环的结束条件是arg不存在,即为nil

   NSLog(@"当前参数:%d" , arg);

  result+=arg;

}

   va_end(list); //置空列表指针

   return result;

}

@end

#import <Foundation/Foundation.h>

#import "AddVarFun"

int main(int argc, const char *arg[])

{

   @autoreleasepool{

       AddVarFun *addTest = [ [AddVarFun alloc] init];

      int result = [addTest add:1, 2, 3, 4, 5, nil];

     NSLog(@"%d", result);

}

    return 0 ;

}

一个简单的OC实现的可变参数加法函数就实现了,实现时需注意,定义函数前要确定传入的可变参数的类型一致。调用时,传入的最后一个参数必须为nil。通过类似方式我们可以根据自己的需要,实现自己的可变参数函数。

上一篇下一篇

猜你喜欢

热点阅读