OC中实现可变参数
通过哨兵参数实现,相当于nil.
1.c语言中
#import <stdio.h>
#import <stdarg.h> int addemUp(int firstNum,...)
{
va_list args;//指向参数的指针
int sum = firstNum;
int number; va_start(args, firstNum);//firstNum是...前1个参数
while(1)
{
number = va_arg(args, int);//返回参数列表中指针args所指的参数,返回类型为type,并使指针args指向参数列表中下一个参数。
printf("number = %d\n",number);
sum += number;//求和
if (number == 0)
{
break;
}
}
va_end(args);//清空参数列表,并置参数指针args无效
return sum; } int main(int argc, const char * argv[])
{
printf("sum of %d\n",addemUp(1,2,3,4,5,0));
return 0;
}
于是哨兵参数(sentinel)这个东西就出来了。上面例子中最后一个参数0就是一个哨兵参数,它的作用就是告诉函数没有参数了。这也是为什么ObjC中[NSArray arrayWithObjects: ...,nil]最后必须以nil参数结尾的原因。
使用__attribute__((sentinel))语法可以告诉编译器这是一个需要哨兵参数的函数。
#import <stdio.h>
#import <stdarg.h> void printString(char *first,...) __attribute__((sentinel)); void printString(char *first,...)
{
va_list args;
va_start(args,first);
char *string = first;
while (string != nil)
{
printf("%s",string);
string = va_arg(args, char *);
printf("\n");
}
va_end(args);
printf("\n");
} int main(int argc, const char * argv[])
{
printString("spicy","pony",nil);
return 0;
}
-(void)setTitleWithString:(NSString *)title,... __attribute__((sentinel))
{
NSMutableArray *argsArray = [[NSMutableArray alloc]init];
if(title)
{
[argsArray addObject:title]; va_list params; //定义一个指向个数可变的参数列表指针
va_start(params,title); //va_start 得到第一个可变参数地址
NSString *arg;
while((arg = va_arg(params, NSString *)))//va_arg 指向下一个参数地址
{
if(arg)
{
[argsArray addObject:arg];
}
}
va_end(params); //置空
} for(NSString *s in argsArray)
{
NSLog(@"%@",s);
} } http://www.cnblogs.com/huen/p/3528156.html
OC中实现可变参数的更多相关文章
- C# 中的可变参数方法(VarArgs)
首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...
- Java中的可变参数以及foreach语句
Java中的可变参数的定义格式如下: 返回值类型 方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型 变量名称 :数据名称){ ... } public ...
- [BS-18] 对OC中不可变类的理解
对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...
- 【转】C,C++中使用可变参数
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是 int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处 ...
- 关于Retrofit网络请求URL中含有可变参数的处理
开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...
- [C++]C,C++中使用可变参数
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处, ...
- C语言中的可变参数-printf的实现原理
C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出 ...
- Java中的可变参数
1.什么是可变参数 可变参数是JDK1.5的新特性,允许一个方式接受任意数量的参数 public static void main(String[] args) { print("a&quo ...
- [集合]java中的 可变参数
可变的参数类型,也称为不定参数类型.英文缩写是varargus,还原一下就是variable argument type.通过它的名字可以很直接地看出来,这个方法在接收参数的时候,个数是不定的. pu ...
随机推荐
- 一次查找Windows Live Writer的VSPaste插件丢失RTF格式信息的经历
背景 我在博客园上写博客是使用Windows Live Writer,代码高亮插件是使用Paste from Visual Studio(下文简称VSPaste). Windows Live Writ ...
- spring源码分析-core.io包里面的类
前些日子看<深入理解javaweb开发>时,看到第一章java的io流,发觉自己对io流真的不是很熟悉.然后看了下JDK1.7中io包的一点点代码,又看了org.springframewo ...
- spring boot 入门一 构建spring boot 工程
最近在学习Spring boot,所以想通过博客的形式和大家分享学习的过程,同时也为了更好的学习技术,下面直接进入Spring boot的世界. 简介 spring boot 它的设计目的就是为例简化 ...
- check选择样式
样式一(H5): <form action="#"> <div class="wrapper"> <div class=& ...
- ci 3.0 默认路由放在子文件夹 无法访问的解决办法
比方说你想配置默认路由为: $route['default_controller'] = 'index/home'; ci3.0之前是可以放在 controllers中的子文件夹中的,但是到了ci ...
- leaflet 整合 esri
此 demo 通过 proj4js 将 leaflet 与 esri 整合起来,同时添加了 ClusteredFeatureLayer 的支持. 下载 <html> <head> ...
- Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...
- 普通用户查看Oracle参数的值
create or replace function get_param(p_name in varchar2)return varchar2as l_param_type number; l_in ...
- 7 Recursive AutoEncoder结构递归自编码器(tensorflow)不能调用GPU进行计算的问题(非机器配置,而是网络结构的问题)
一.源代码下载 代码最初来源于Github:https://github.com/vijayvee/Recursive-neural-networks-TensorFlow,代码介绍如下:“This ...
- Spring手册
一.Spring 简介 二.结构体系 三.七大主要模块 四.Spring Maven依赖 五 .Sprinf framework 一.Spring 简介 spring是一个开源的轻量级的应用开发框架, ...