- 浏览: 3472268 次
- 性别:
- 来自: China
-
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
VA_LIST 是在C语言中解决变参问题的一组宏
他有这么几个成员:
1) va_list型变量:
#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
#else
typedef char * va_list;
#endif
2)_INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
3)VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
4)VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
5)VA_END宏,清空va_list可变参数列表:
#define va_end(ap) ( ap = (va_list)0 )
VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
(4)最后用VA_END宏结束可变参数的获取。
使用VA_LIST应该注意的问题:
(1)可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
(2)如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
(3)因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码;
小结:可变参数的函数原理其实很简单,而VA系列是以宏定义来定义的,实现跟堆栈相关。我们写一个可变参数的C函数时,有利也有弊,所 以在不必要的场合,我们无需用到可变参数,如果在C++里,我们应该利用C++多态性来实现可变参数的功能,尽量避免用C语言的方式来实现。
示例代码: #include<stdio.h> #include<stdarg.h> void simple_va_fun(int start,...) { va_list arg_ptr; int nArgValue = start; int nArgCount = 0; va_start(arg_ptr,start); do { ++nArgCount; printf("the %d the arg:%d\n",nArgCount,nArgValue); nArgValue=va_arg(arg_ptr,int); }while(nArgValue != -1); return; } main() { simple_va_fun(100,-1); simple_va_fun(100,200,-1); getchar(); } /////////////////// int writeMultiString(void *c, ...) { va_list ap; const char *str; va_start(ap, c); str = va_arg(ap, const char *); while (str != NULL) { fputs(str, (FILE *)c); str = va_arg(ap, const char *); } va_end(ap); return 0; }
// Quick Information Display void show(id formatstring,...) { va_list arglist; if (!formatstring) return; va_start(arglist, formatstring); id outstring = [[[NSString alloc] initWithFormat:formatstring arguments:arglist] autorelease]; va_end(arglist); UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"LEAK DEMO" message:outstring delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; [av show]; } - (void) intro { show(@"Run with Instruments using Leaks. Click a button to leak memory.%@\n",@"zyjzyj"); }
#define showAlert(format, ...) myShowAlert(__LINE__, (char *)__FUNCTION__, format, ##__VA_ARGS__) // Simple Alert Utility void myShowAlert(int line, char *functname, id formatstring,...) { va_list arglist; if (!formatstring) return; va_start(arglist, formatstring); id outstring = [[[NSString alloc] initWithFormat:formatstring arguments:arglist] autorelease]; va_end(arglist); NSString *filename = [[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent]; NSString *debugInfo = [NSString stringWithFormat:@"%@:%d\n%s", filename, line, functname]; UIAlertView *av = [[[UIAlertView alloc] initWithTitle:outstring message:debugInfo delegate:nil cancelButtonTitle:@"OK"otherButtonTitles:nil] autorelease]; [av show]; } - (void) rightAction: (id) sender { showAlert(@"You pressed the right button"); }
发表评论
-
NSValue对任何结构体,基本类型,指针的封装
2015-08-28 09:56 4103任何结构体: 一个NSValue对象是用来存 ... -
IBInspectable / IBDesignable
2015-08-20 21:21 1726感谢:http://nshipster.cn/ibinsp ... -
Nullability and Objective-C
2015-06-18 15:59 2031https://developer.apple.com/s ... -
枚举类型 enum,NS_ENUM,NS_OPTIONS
2014-12-07 23:07 1536一般情况下,我们采用C风格的enum关键字可以定义枚举类型。 ... -
类生成字典
2014-12-07 01:18 1281-(NSDictionary *)toDict ... -
Objective-C Runtime 成员变量与属性
2014-12-06 23:49 2904习题内容 下面代码会? Compile Error / ... -
消息 和 Category
2014-12-06 23:37 1436习题内容 下面的代码会?Compile Error / ... -
对象&类&元类(Object & Class & Meta Class)
2014-12-06 22:34 5705作为C语言的超集,面向对象成为Objective-C与C语 ... -
Self & Super
2014-12-06 21:59 3779在 Objective-C 中的类实现中经常看到这两 ... -
Objective-C Runtime
2014-12-06 18:31 32118Objective-C Runtime 本文详细整理 ... -
Objective C 中的nil,Nil,NULL和NSNull理解
2014-11-26 14:26 1848ObjC 里面的几个空值符号经常会差点把我 ... -
《Effective Objective C 2.0》笔记
2014-10-21 13:36 2621第1章 熟悉objective-c 1 ... -
nil/Nil/NULL/NSNull
2014-04-11 16:47 0理解“不存在”的概 ... -
Objective-C 的“多继承”
2014-03-28 23:18 1595当单继承不够用,很难为问题域建模时,我们通常都会直接想到多 ... -
ios7 JavaScriptCore.framework
2014-03-26 01:19 30134以前想要oc调用js代码一般是通过uiwebview的st ... -
Objective C运行时(runtime)技术的几个要点总结
2014-02-20 10:09 14551from:http://www.cnblogs.com/g ... -
Method Swizzling
2014-02-20 10:11 3583Thx: http://esoftmobile.com/2 ... -
(译)Objective-C的动态特性
2014-02-20 10:09 2925过去的几年中涌现了大量的Objective-C开发者。有些 ... -
Associated Objects
2014-02-20 10:09 5501本文翻译自NSHipster的 ... -
兼容acr和非arc的宏定义
2013-11-16 16:08 0/**************** Support both ...
相关推荐
### va_start、va_end、va_list的详细使用方法 #### 概述 在C语言中,函数参数的数量通常是固定的。然而,在某些情况下,我们可能希望一个函数能够接收可变数量的参数。例如,`printf`函数就是一个很好的例子,它...
### stdarg.h中三个宏va_start,va_arg和va_end的应用详解 在C语言中,经常需要编写能够接受可变数量参数的函数。一个典型的例子就是`printf`函数,它可以接受任意数量和类型的参数。为了支持这种功能,C语言提供了...
写可变参数的C函数要在程序中用到以下这些宏: 代码如下:void va_start( va_list arg_ptr, prev_param );type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );va在这里是variable-argument(可变...
3. 一旦所有参数都被处理,记得使用`va_end`宏来清理`va_list`,这标志着可变参数列表的结束。 ```c va_end(args); ``` 4. 使用`va_arg`需要注意的是,必须按照参数实际传递的顺序和类型来使用。如果参数类型不...
这主要通过一组预定义的宏来实现,包括`va_list`、`va_start`、`va_arg`和`va_end`,这些宏定义在`stdarg.h`头文件中。下面我们将详细探讨这些宏的用途和工作原理。 1. `va_list`: `va_list`是一个类型定义,它...
这种灵活性主要由两个关键组件实现:`va_list`类型和宏`va_start`, `va_arg`和`va_end`。下面我们将逐一解析这些概念。 **`va_list`** `va_list`是一个特殊类型,用于存储可变参数列表的状态。当函数被调用时,`va...
1. 因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型。 2. 另外还有一个问题,因为编译器对可变参数的函数...
本文讨论了C语言中可变参数的用法,包括如何写一个简单的可变参数的C函数,如何使用可变参数宏va_start、va_arg和va_end,以及可变参数在编译器中的处理。 一、写一个简单的可变参数的C函数 在C语言中,某些函数...
要使用`_va_list`,你需要包含`<stdarg.h>`头文件,然后利用`va_start`, `va_arg`和`va_end`宏来初始化和操作`_va_list`变量。 - `va_start`: 初始化`_va_list`变量,使其指向可变参数列表的第一个参数。 - `va_arg...
2. 使用`stdarg.h`库(C)或`<cstdarg>`库(C++)处理可变参数的三个关键宏:`va_start`、`va_arg`和`va_end`。 3. 如何在函数中定义和使用`va_list`,以及如何正确处理参数类型。 4. 通过实例展示了如何创建一个...
在这个例子中,`__VA_ARGS__` 捕获了`printf`格式化字符串后的所有参数,并在`vprintf`函数中使用`va_list`和`va_start`、`va_end`进行处理。 ### 可变参数函数 可变参数函数允许函数接受不同数量的参数。在C语言...
可变参数函数的实现主要包括几个宏:va_list, va_start, va_arg, va_end。下面将详细讲解这些宏以及它们的用法: 1. va_list: 这个类型用于声明一个变量,该变量会被用来遍历参数列表。在stdarg.h中,va_list被定义...
这个头文件中定义了`va_list`、`va_start`、`va_arg`和`va_end`宏,它们是处理可变参数列表的关键。下面逐一解释这些宏的作用: 1. `va_list`: 这是一个类型定义,用来声明一个可变参数列表的变量。例如:`va_list ...
这种机制是通过一组特殊的宏实现的,包括`va_start`、`va_arg`、`va_end`和`va_copy`。本文将详细探讨这些宏的用法,并通过几个实际例子来阐述其工作原理。 ### 一、`va_start`宏 `va_start`是用于初始化可变参数...
这个头文件声明的一个va_list的类型,和三个宏va_start,va_arg,va_end。我们可以生明一个va_list类型的变量,配合三个宏使用。 va_start(arg, last have name arg); 初始化之后,arg将指向第一个无名参数。 va_...
本文将深入探讨如何使用`va_list`、`va_start`、`va_arg`和`va_end`这四个宏来处理这种特殊的参数传递。 `va_list`是一个类型定义,它定义了一个可以存储变长参数列表中下一个参数地址的类型。在函数中,我们需要...
va_start宏用于初始化可变参数表,va_arg宏用于取得当前的可变参数,va_end宏用于结束可变参数的使用。 va_start宏的原型为:void va_start(va_list ap, prev_param),其中ap是指向可变参数表的指针,prev_param是前...
- **内存管理**: 避免对`va_list`指针进行不当操作,确保在使用完毕后调用`va_end`。 #### 结论 C语言的变参函数设计提供了一种灵活的方式来处理参数数量不确定的情况,尤其是在需要处理多个类型和数量不定的参数...