如何在一个可变参数函数中调用另一个可变参数函数 [问题点数:40分,结帖人frydsh]

Bbs1
本版专家分:0
结帖率 96.43%
Bbs8
本版专家分:42358
Blank
黄花 2008年11月 C/C++大版内专家分月排行榜第二
Bbs8
本版专家分:42358
Blank
黄花 2008年11月 C/C++大版内专家分月排行榜第二
Bbs8
本版专家分:42358
Blank
黄花 2008年11月 C/C++大版内专家分月排行榜第二
Bbs10
本版专家分:139644
Blank
进士 2007年 总版技术专家分年内排行榜第八
2006年 总版技术专家分年内排行榜第八
Blank
红花 2007年7月 C/C++大版内专家分月排行榜第一
2007年6月 C/C++大版内专家分月排行榜第一
2007年5月 C/C++大版内专家分月排行榜第一
2007年4月 C/C++大版内专家分月排行榜第一
2007年3月 C/C++大版内专家分月排行榜第一
2007年2月 C/C++大版内专家分月排行榜第一
2007年1月 C/C++大版内专家分月排行榜第一
2006年12月 C/C++大版内专家分月排行榜第一
2006年11月 C/C++大版内专家分月排行榜第一
2006年9月 C/C++大版内专家分月排行榜第一
2006年8月 C/C++大版内专家分月排行榜第一
2006年7月 C/C++大版内专家分月排行榜第一
2006年6月 C/C++大版内专家分月排行榜第一
2006年5月 C/C++大版内专家分月排行榜第一
2006年4月 C/C++大版内专家分月排行榜第一
2006年3月 C/C++大版内专家分月排行榜第一
2005年8月 C/C++大版内专家分月排行榜第一
Blank
黄花 2007年8月 C/C++大版内专家分月排行榜第二
2006年10月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2006年1月 C/C++大版内专家分月排行榜第三
2005年7月 C/C++大版内专家分月排行榜第三
Bbs3
本版专家分:526
Bbs1
本版专家分:0
Bbs6
本版专家分:6043
Bbs7
本版专家分:15496
Bbs9
本版专家分:77132
Blank
黄花 2007年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第二
2007年2月 C/C++大版内专家分月排行榜第二
2007年1月 C/C++大版内专家分月排行榜第二
2006年12月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2007年9月 C/C++大版内专家分月排行榜第三
2007年8月 C/C++大版内专家分月排行榜第三
2006年11月 C/C++大版内专家分月排行榜第三
Bbs1
本版专家分:18
关于C语言可变参数函数的写法及其应用
以前一直以为C语言的函数都是精确匹配的,直到看了 C和C指针 才知道还有可变参数的函数。仔细一想,平时最常用的printf ,scanf 不就是可变参数的吗。 先上代码,随后详细讲解<em>可变参数函数</em>的用法。 #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;stdarg.h&amp;amp;amp;amp;gt; void fun(int num, ...) { int i;
c++函数可变参数的使用
最近在做<em>一个</em>软件的多语言支持项目时,用到了函数的可变参数(函数的参数个数未知),简单介绍一下自己的使用方法,下面是写的<em>一个</em>类: Language.h: #pragma once #include &amp;lt;vector&amp;gt; #include &quot;../Share/cnclib/IniFile.h&quot; using namespace std; typedef struct langdata...
C和指针之函数之可变参数
1、可变参数如何实现 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,这个头文件声明了<em>一个</em>类型va_list和三个宏,va_start、va_arg、va_end,一般我们声明<em>一个</em>类型为va_list的变量,和这个几个宏配合使用,访问参数的值。 2、实现<em>一个</em>函数多个参数求均值 比如我们需要实现制定数量的值得平均值(求参数值的平均值) 思路:    
可变参数函数详解
原文地址::http://www.cnblogs.com/clover-toeic/p/3736748.html  <em>可变参数函数</em>又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变。原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, …);      其中,
封装printf sprintf fprintf等可变参数函数
点击打开链接 写<em>一个</em>函数封装printf void my_printf(const char *format,...) { va_list args; va_start(args,format); vprintf(format,args); //必须用vprintf va_end(args); }
C语言中可变参数函数实现原理
C语言中<em>可变参数函数</em>实现原理 printf()\scanf() <em>可变参数函数</em>的设计
函数重载和可变参数函数
函数重载重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染。这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同构成函数重载的条件如下: 1、函数名相同。 2、这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,即参数列表不同。注意,返回值类型不同不构成重载函数。重载函数的匹配原则: 1、严格匹配,找到后就<em>调用</em>。 2、没有找到严格匹配的函数,但...
python 可变参数函数定义* args和**kwargs的用法
python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法。其中,*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前 下面<em>一个</em>例
C++ 可变参数函数源码(含类作为函数参数)
C++中<em>可变参数函数</em>的源码,文件很小,但可以供参考用,还特地写了<em>一个</em>类作为<em>可变参数函数</em>的参数。可以直接编译。
可变参数函数用它的可变参数调用另外一个可变参数函数
//意思是这样:rnvoid print_and_msg(TCHAR* fmtStr, ...)rn CString buf;rn buf.Format(fmtStr, ...);rn AfxMessageBox(buf);rn;rnrn怎么写能简单点呢? thanks!rn
ios开发Objective-C可变参数函数
首先作为<em>一个</em>coder 很多时候会遇到自己不能解决的问题需要上网查资料,因为没有学过多少c语言,所以这方面只能请求网上的前辈,然后就看了关于 “Objective-C<em>可变参数函数</em>”的文章,可惜网上只有转载,其实就是1篇文章而已。   而且不知道我自己水平没能理解 还是演示demo就有问题,或者大家都没发现的<em>一个</em>问题。这里重新按照自己的理解重新写<em>一个</em>使用oc<em>可变参数函数</em>的方法。本人能力有限
c/C++可变参数函数的参数传递机制剖析
文章对<em>可变参数函数</em>的参数传递机制进行了剖析, 给出了准确、灵活设计<em>可变参数函数</em>的另一种方法
可变参数函数调用
要编<em>一个</em>windows程序快速集成已有的一批dos下C语言的数学计算程序,需要编制int newprintf(const char * format,...)和newscanf函数,替换掉原来的printf和scanf函数,起到将前者导向到集成程序的<em>一个</em>edit窗口的目的。rn问题是,newprintf(const char * format,...)将如何写?内部将<em>调用</em>sprintf来获得<em>一个</em>字符串,写到edit窗口,如何<em>调用</em>sprintf函数?rn请试验成功再回答!rnrn
C语言可变参数函数取参方法
熟悉C的人都知道,C语言支持<em>可变参数函数</em>(Variable Argument Functions),即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()\execl函数等;printf函数的原型如下: int printf(const char *format, ...); 注意,采用这种形式定义的<em>可变参数函数</em>,至少需要
C语言可变参函数的实现
1 C语言中函数<em>调用</em>的原理函数是大多数编程语言都实现的编程要素,<em>调用</em>函数的实现原理就是:执行跳转+参数传递。对于执行跳转,所有的CPU都直接提供跳转指令;对于参数传递,CPU会提供多种方式,最常见的方式就是利用栈来传递参数。C语言标准实现了函数<em>调用</em>,但是却没有限定实现细节,不同的C编译器厂商可以根据底层硬件环境自行确定实现方式。函数<em>调用</em>的一般实现原理,请参考我的博文 C语言中利用setjmp和lon
# ##和 VA ARGS
# ## VA ARGS <em>可变参数函数</em>
C语言中可变参数函数的定义
今天在看scanf原型时,看到scanf的原型是int scanf(const char *format,...),居然有省略号,百度了一下才发现,C语言中居然可以声明可变参数的函数。6年的C语言白学了么???才打了<em>一个</em>多小时假鸡,头昏昏的,过两天在来看是什么情况把。参考链接先摆<em>一个</em>http://blog.csdn.net/jxth152913/article/details/5588639...
Java中编写可变长参数的函数
越来越多的Java库使用了可变长参数,不再需要加<em>一个</em>new Object[]那么别扭。 那么如何自己实现<em>一个</em>这样的可变长函数呢? 我们就以实现<em>一个</em>一长串的整数相加作为例子: 变长参数传到函数以后,其实就是<em>一个</em>数组,像数组那样操作就行了。 例子: public class KMath { public static int add(int... args) {
iOS可变参数函数的编写
可变参数类似于 NSLog() 等类型的函数的编写,主要分为四步:1> va_list p_list; 2> va_start(p_list, formart); 3> (s = va_arg(p_list, NSString *) 4> va_end(p_list);具体例子如下:- (void)showM
如何确定特定情况下可变参数函数的参数个数
1.心血来潮,想了解一下<em>可变参数函数</em> 这是vadefs.h函数中相关的定义     #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))     #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) -
ATL字符串转换类
字符串的ASCII和UNICODE之间的转换很常用,Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能。但凡Win32的API,参数<em>调用</em>都不会少,因此使用起来也就觉得有点繁琐。ATL3中提供了字符串转换宏,如T2W、A2T等,不过使用它们需要借助本地变量,因此在使用之前需要声明USES_CONVERSION宏来声明本地变量.而且还
[c++11]可变参数函数模板
#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; std::vector&amp;lt;void*&amp;gt; arg_list; void push_args(){ for(auto &amp;amp;arg:arg_list){ std::cout &amp;lt;&amp;lt; std::hex &amp;lt;&amp;lt; arg &amp;lt;&amp;lt; std...
Python 函数(可变参数)
在python函数中,可以定义可变参数,顾名思义,可变参数就是,传入的参数是可变的 例如,给定一组数字a,b,c...  请计算a2 + b2 + c2 + ……  要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c....作为<em>一个</em>list或者tuple传进来,这样,函数可以定义如下: 1 2 3 4 5 ...
C语言可变参数函数实现printf功能
最近在学习S3C2440这款ARM芯片,在学习到串口时,需要通过串口向pc机打印串口信息。以前在学习51和stm32时都是通过操作寄存器实现<em>一个</em>putchar()函数,然后向pc机发送信息,用起来很是不大方便。所以去了解了一下printf()函数的实现方法。现将其总结下来与大家分享。在头文件#include &amp;lt;stdarg.h&amp;gt;中有一组宏定义 ,用于获取不确定参数的个数。#define...
自定义可变参函数
文章目录一、可变参函数1、va_list简介2、va_list成员3、va_list原理4、va_list用法 一、可变参函数   在C语言编程中,我们经常会遇到一些参数个数可变的函数,如:int printf(const char *format, ...);、scanf()等等。它除了第<em>一个</em>参数format固定以外,后面跟着的参数的个数和类型是可变的,其中...称作参数占位符。   可是上述中...
如何实现函数来处理可变参数
使用va宏实现具有可变参数的函数
C++可变参数的函数
可变参数的函数,写法如下:          type Function(固定参数1,固定参数2,……固定参数n,…);          可见,可变参数的函数有两种参数,一种是固定参数,一种是可变参数。          固定参数就是一定要输入的参数,其个数确定,类型确定。一般的函数都是使用固定参数。          可变参数用“…”来表示。其个数不固定。          <em>一个</em>可变
【C++基础之二十】可变参数的函数
C++中可变参数的函数是从C中继承而来,可变参数的函数是指函数的参数个数可变,参数类型不定的函数。我们最常见的就是printf()。 1.<em>可变参数函数</em>实现原理 指定参数的函数实现很简单,通过通过指定的参数名访问就行了。但是如果不指定的呢?函数的<em>调用</em>的参数会进行压栈处理,详细可见此文函数<em>调用</em>机制。而对参数的压栈是从右到左进行压栈。而参数和参数之间存放是连续的,也就是说,只要知道第<em>一个</em>参数
C#之方法的可变参数(params)
今天笔者看了网上的很多关于基础的可变参数的用法,说实话,以我的感觉很多人都没有把这个问题说清楚。有一些所谓大神更是将数组作为实参传递给<em>一个</em>可变参数作为可变参数的使用案例来讲。虽然这也是可以的,但是遇到像我这样的新手不禁会问:“如果只是将数组传递给<em>一个</em>可变参数数组,那么完全不必用params关键字修饰,直接将实参数组传递给形参数组不就行了吗,这怎么又能说明可变参数的应用必要性呢。”。 笔者说一下自
c/c++支持可变参数的函数
c/c++支持可变参数的函数,即函数的参数是不确定的。一、为什么要使用可变参数的函数?一般我们编程的时候,函数中形式参数的数目通常是确定的,在<em>调用</em>时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入<em>可变参数函数</em>。这也是c功能强大的<em>一个</em>方面,其它某些语言,比如fortran就没有这个功能。典型的<em>可变参数函数</em>的例子有大家熟悉的print
C/C++定义可变参数函数,演示程序
C/C++定义<em>可变参数函数</em>,演示程序,教你怎么写<em>一个</em>参数可变的函数
【C语言】如何写一个参数可变的函数
在C语言开发中,有时候需要写<em>一个</em>参数可变的函数,类似于print打印函数一样,可以接收多个任意参数。那么,我们应该怎样写呢?答案是:使用stdarg.h头文件。
封装一个可变参数打印函数
在开发中,经常会用到打印,而这些打印在程序运行阶段不需要,仅在调试或开启现象的时候需要,我们用printf来打印往往不能对其进行灵活的控制,这个时候,我们就可以自己封装<em>一个</em>与printf功能相同的打印函数,加一些调试开关,就可以。 用到的接口: #include &amp;lt;stdarg.h&amp;gt; int vprintf(const char *format, va_list...
可变参数与参数进栈顺序
可变参数与参数进栈顺序 C支持可变参数的函数,这里的意思是C支持函数带有可变数量的参数,最常见的例子就是我们十分熟悉的printf()系列函数。我们还知道在函数<em>调用</em>时参数是自右向左压栈的。如果<em>可变参数函数</em>的一般形式是: f(p1, p2, p3, …) 那么参数进栈(以及出栈)的顺序是: … push p3 push p2 push p1 call f pop p1 pop p
Matlab中使用varargin来实现参数可变的函数
原文:http://blog.csdn.net/yefengnidie/article/details/4522002  在写《用Matlab演示Parzen窗法》的时候,我还不知道怎样在m中设计<em>可变参数函数</em>。       后来阅读一些m自带函数源码时发现了它的秘密,只要将最后<em>一个</em>参数设置为varargin,就可以实现。       例如,写了<em>一个</em>函数:function test
C# 函数、委托和可变参数
using System; namespace ConsoleApp1 { //! 5 delegate int Max(int a,int b); class Program { public void show() { } //! 1 public void max()
C++ 可变参数定义及使用
#include&amp;lt;iostream&amp;gt; 2 using namespace std; 3 void PrintAll(int n,...){ 4 int *ptr; 5 ptr = &amp;amp;n; 6 while(*ptr){ 7 cout&amp;lt;&amp;lt;*ptr&amp;lt;&amp;lt;endl; 8 ptr++; 9 ...
js函数可变参数
js函数可变参数
C++中传递可变参数
std::string &amp;amp; getFormattedStr(std::string &amp;amp;strFormatted, const char *strFormat, va_list arglist) { const int MAX_FORMATTED_STR_LEN = 2048; char strResult[MAX_FORMATTED_STR_LEN] = { 0 }; vsp...
dopen变函数变参数实现
dopen打开库, <em>调用</em>变函数,传入变参数 g++ lib_call.c  -o lib_call -ldl   #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;dlfcn.h&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;st...
C/C++中可变参数函数的实现
在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和<em>一个</em>类型va_list。利用它们,我们可以很容易实现<em>一个</em>可变参数的函数。首先简单介绍一下这三个函数。假设现在有<em>一个</em>名为f的函数,其函数定义为: void f(int a, int b, ...) 那么,在函数的内部,为了获得这些可变参数,就需要利用到va_start、va_arg和va_end三个函
05 printf函数可变参数的实现原理之汇编分析
如实现<em>一个</em>像printf函数格式的函数: test.c void myprintf(char *line, ...) // line指针变量是局部变量,在栈里分配空间 { printf(line); //<em>调用</em>printf时,r0存放字符串地址 } int main(void) { myprintf("hello test %d, %d, %s, %d,
自己写的仿fprintf()函数和可变参数函数浅析
自己写的仿fprintf()函数和<em>可变参数函数</em>浅析 编辑程序绝不是一件简单的事情,我也是如此。因为c语言的强大之处,所以我觉得即使是一年前学的c语言,我还是对于有些语法难以解释的清。而正因为难以解释的清,我在开始<em>一个</em>项目的时候本认为可以顺利的完成的,结果时间拖了又拖,最后还是没有完成。 这个周末我一直在研究怎样写<em>一个</em>属性脚本系统。这个脚本系统主要是实现用文本文件来控制程序的某些参数。现在还
CString 参数传递问题
CString 参数传递问题如果不是去做,肯定不能体会到这些看似芝麻大点的小问题会把你搞得焦头烂额!先把这个问题记下来:CString 参数传递约定当定义类接口时,必须确定为成员函数确定参数传递约定。现在有一些传递和返回 CString 对象的标准规则。如果遵循作为函数输入的字符
可变参数宏__VA_ARGS__和...
__VA_ARGS__ 是<em>一个</em>可变参数的宏(gcc支持)。实现思想就是宏定义中参数列表的最后<em>一个</em>参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。加##用来支持0个可变参数的情况。 测试代码: #include #define PRINT_DBG(debug, ...)\ {\ if(debug) {\ ...
c 根据 可变参数合成字符串
写代码时, 经常需要根据参数值得到一特定的字符串. 每次都<em>调用</em>vsprintf, malloc很烦. 以下是<em>一个</em> 实现了此功能的接口. /***************************************************************************** * Copyright : All Rights Reserved. *
利用可变参实现fprintf函数
#include #include /* 可变参相关接口 typedef char * va_list ; void va_start (va_list ap , prev_param) ; type va_arg(va_list ap , type) ; void va_end(va_list ap); */ int myfprintf(FILE* fp, char* fmt, ..
C语言可变参数vsprintf
/* 函数名: vsprintf 功 能: 送格式化输出到串中 返回值: 正常情况下返回生成字串的长度(除去\0),错误情况返回负值 用 法: int vsprintf(char *string, char *format, va_list param); // 将param 按格式format写入字符串string中 注: 该函数会出现内存溢出情况,建议使用vsnprintf 程
va_list(可变参数函数的使用)
A_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入<em>一个</em>参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。va_list 用法示例:#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdarg.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; i...
动态的调用可变参数函数
最近,碰到了<em>一个</em>奇怪的问题:如<em>何在</em>函数中动态的<em>调用</em><em>可变参数函数</em>。例如说,有某个<em>可变参数函数</em>:void Func1(int a, ...) { ... }现在给出<em>一个</em>个数不定的动态数组,把里面的数值按顺序的作为可变参数传递进 Func1 函数中。当然,如果允许改变 Func1 的定义,那么我相信每个人都可以轻松的完成这个任务,而且方法一定也是八仙过海,各显神通。但是如果限定不可以更改 F
关于可变参数函数调用
假设我有<em>一个</em>函数 print 用于打印<em>一个</em>数组:rnvoid print(int* arr,int len)rnrn for(int i = 0;i
揭密X86架构C可变参数函数实现原理
前两天公司论坛有同事在问C语言<em>可变参数函数</em>中的va_start,va_arg 和 va_end 这些接口怎么实现的?我毫不犹豫翻开箱底,将多年前前(算算有十年了)写的文章「亲密接触C<em>可变参数函数</em>」发给他,然后开始了深入的技术交流,才有现在这篇文章,所以这篇文算是写给同事的,也分享给大家。 「亲密接触C<em>可变参数函数</em>」这篇文章讲的是i386架构下<em>可变参数函数</em>的实现原理,但是从i386到X86架构,两...
OC可变参数的函数实现va_start、va_end、va_list的使用
一、简介 我们经常在编程的时候看见类似这样的代码,如图1.1 图1.1 或者是这样的可变参数,如图1.2 图1.2 二、基本知识介绍 在学习如何写这种格式的函数前,先简单介绍几个常用的宏: 以下摘自:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html
动态的调用可变参数函数
动态的<em>调用</em><em>可变参数函数</em> 作者:      来源:http://blog.csdn.net/yhz 最近,碰到了<em>一个</em>奇怪的问题:如<em>何在</em>函数中动态的<em>调用</em><em>可变参数函数</em>。例如说,有某个<em>可变参数函数</em>:void Func1(int a, ...) { ... }现在给出<em>一个</em>个数不定的动态数组,把里面的数值按顺序的作为可变参数传递进 Func1 函数中。当然,如果允许改变 Func1 的定义
Swift 调用 Objective-C 的可变参数函数
这个问题是<em>一个</em>朋友问我怎么写,一开始我是拒绝的。我想这种东西网上随便 google 下不就有了吗。他说,查了,但没大看明白。于是我就查了下,没想到这个写法确实有点诡异,我第一反应也没看明白。所以随便水一篇文章,强行完成本周的博客任务,顺便给朋友<em>一个</em>交代。 本文分为两部分,第一部分是 Swift 怎么<em>调用</em> Objective-C 的<em>可变参数函数</em>,第二部分是 Objective-C 怎么<em>调用</em> Swif...
c语言实现的一个简单的日志函数
c语言实现的<em>一个</em>简单的日志函数, 主要是实现<em>可变参数函数</em>的使用技巧!
Scala 可变参数函数的灵活调用
Scala <em>可变参数函数</em>的灵活<em>调用</em>
scala调用java可变参数函数
如图java 版本中,ShardJedis 中有一可变参数的函数 public List&amp;lt;String&amp;gt; hmget(String key, String... fields) { Jedis j = getShard(key); return j.hmget(key, fields); } 则,在scala 中的<em>调用</em>如下。 val res = jedis.hmge...
C++参数个数可变函数的本质
va_list是<em>一个</em>宏,由va_start和va_end界定。     typedef char* va_list;   void va_start ( va_list ap, prev_param );   type va_arg ( va_list ap, type );   void va_end ( va_list ap );     其中,va_list 是<em>一个</em>字符指针,可
C语言中可变参数的使用方法
写在前面 其实,可变参数这个东东自从入门C语言开始就一直在使用,最经典的就是printf打印输出。不论是从事嵌入式开发,还是搞Android的NDK开发,经常会用到可变参数输出log,但是很多时候是用别人封装好的API,而忽略了事情的本质。 需求 平时我们写C语言函数时,一般是固定参数的,但是像打印输出格式化内容时,其参数个数就不确定了,类似如下: printf(&quot;This is ...
Android JNI静态和动态注册 、Java Reflect(C或C++层反射和JAVA层反射)、Java 可变参数(JNI实现)
#PS:要转载请注明出处,本人版权所有 #PS:这个只是 《 我自己 》理解,如果和你的 #原则相冲突,请谅解,勿喷 由于最近重新接触了部分Android相关的东西,对一些需要混合编程的手段做了整理,同时也对Java中常见的反射技术进行归纳总结。(本文适合知道JNI和反射是什么鬼的人阅读)(可变参数实现在JNI部分的IoctlGpio方法) JNI部分 Java nat
Golang可变参数函数调用
最近,在写代码的过程中,用到了某个任意类型的不定参数接口package reflectimport ( "fmt" )func InterfaceArg() { interfaceArg := []string{"NetworkSettings","IPAddress"} receiveAnyType(interfaceArg...) } func receiveAnyTyp
Java利用可变参数函数一个打印方法。
public void print(String... args) { String str = ""; for(int i = 0; i < args.length; i++){ str += args[i]; if( i != args.length - 1){ str += ", "; } }
linux下可变参数及宏定义封装函数
以下函数包含内容:a 使用宏封装可变参函数 b 可变参数。比较简单,无注释。   两个函数均可以打印出<em>调用</em>者的文件、函数、行号信息。需要参考该代码的,拿走不谢!   #include  #include  #include      #define BUF_LEN 500   /* 封装调试函数 */ #define macroFunc(info)  (transparen
C语言的可变长参数函数
可变参数的函数通在参数列表的末尾使用省略号(…)定义。 举例如下: #include&amp;amp;amp;amp;lt;stdarg.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; int sum(int, ...);//<em>可变参数函数</em>,用于几个求int数据的和 int main(void) { printf(&amp;amp;amp;quot;10、20 和 30 的和 = %d
一个类似printf的可变参数函数
#include stdio.h>#include stdlib.h>void print(char* format, ...)...{   char* pArg=NULL,*p;   char c;   pArg = (char*) &format;    //取得栈中变量的首地址   pArg += sizeof(format);while (*format != )...{   c 
Java方法可变参数个数的简单使用
简单的demo能让我们能快速了解它的用法。代码:package org.fly.justTest; /** * java方法可变参数个数的简单使用 * * int...counts本质就是int[] counts * @author fly * */ public class Demo { public static void add(int...counts){ int...
如何写可变参数函数
想写<em>一个</em>可变参数的函数,于是深究了一下printf函数。还好,看懂原理了。先上一段自己写的带有可变参数的函数:rn[code=C/C++]#include "stdio.h"rn#include //va_start ,va_arg,va_end定义在这个文件里rnrnint sum( int num, ... ) rn rn int answer = 0; rn va_list argptr; rn va_start( argptr, num ); rnrn printf("num addr : %p\n",&num);rn rn for( ; num > 0; num-- ) rn rn printf("argptr = %p, argptr data : %d \n",argptr,*(int*)argptr);rn answer += va_arg( argptr, int ); rn rnrn va_end( argptr ); rnrn return( answer ); rn rnint main( void ) rn rnrn int answer = sum( 4, 4, 3, 2, 1 ); rnrn printf( "The answer is %d\n", answer ); rnrn return( 0 ); rnrn[/code]rnrn上面这段代码在VS2008中已编译运行过,输出结果如下:rnnum addr : 0020F658rnargptr = 0020F65C, argptr data : 4rnargptr = 0020F660, argptr data : 3rnargptr = 0020F664, argptr data : 2rnargptr = 0020F668, argptr data : 1rnThe answer is 10rn您运行结果argptr和num addr的值可能会跟这里不一样,因为这个地址是传递参数时堆栈地址,每次运行程序时所得到的堆栈地址不一定相同。rn 接下来我们一步一步的来分析sum函数实现的原理。要想透彻的理解您可能需要了解通过堆栈向函数传递参数以及这个函数如何从堆栈中取出每个参数方面的知识。过几天我会以sum函数为例来说一下我的理解。rn 理解sum函数其实是要理解va_start、va_arg和va_end这三个宏。rn这三个宏主要用在<em>可变参数函数</em>中用来取出<em>一个</em>个可变参数的,定义在stdarg.h文件里,原型如下:rn#define va_start _crt_va_startrn#define va_arg _crt_va_argrn#define va_end _crt_va_endrnrn_crt_va_start、_crt_va_arg和_crt_va_end定义在vadefs.h文件里:rn#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )rn#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )rn#define _crt_va_end(ap) ( ap = (va_list)0 )rnrn这几个宏里面用到的相关的宏在vadefs.h文件里:rntypedef char * va_list;rn#define _ADDRESSOF(v) ( &(v) )rn#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )rnrnrn通过上面这些信息可以看到:rn va_start(ap,v) 其实就是使ap指向保存在参数v之后紧接着的那个参数,也就是取出紧接着参数v之后的参数的地址。一般使用时传进来的v是位于第<em>一个</em>可选参数之前的固定参数,(或者说,最后<em>一个</em>固定参数;…之前的<em>一个</em>参数),函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的(在后会有提到)。例如本例中固定参数为num,它也是第<em>一个</em>可选参数之前的固定参数,所以这样使用:rnva_start( argptr, num ); rn va_arg(ap,t) 是取出ap地址处保存的参数*(t *)(ap),然后使ap指向紧接着的下<em>一个</em>参数。 rn va_end(ap)的作用是让指针ap为空。 rnrn 了解了上面这些,再回头来重读一下sum函数:rn[code=C/C++]sum( 4, 5 ,3, 2, 1 ); rnint sum( int num, ... ) //num表明后面有几个可变参数rn rn int answer = 0; rn va_list argptr; rnva_start( argptr, num ); //此处使argptr指向num ( = 4)后面的参//数,即指向保存5的地方rn// *(int*)argptr = 5rnrn printf("num addr : %p\n",&num);rn rn for( ; num > 0; num-- ) //依次取出每个可变参数rn rn printf("argptr = %p, argptr data : %d \n",argptr,*(int*)argptr);rn answer += va_arg( argptr, int ); //第一次循环,va_arg会返回//5,argptr会指向3;第二次循//环va_arg会返回3,argptrrn //会指向2;依次类推直至结束。rn rnrn va_end( argptr ); //使argptr指向空。rnrn return( answer ); rn[/code]rnrn个人理解,错误的地方恳请大家指点,同时欢迎大家讨论。rn rn
可变参数函数的实现
<em>可变参数函数</em>的实现(kusamba@126.com)rnrn本文通过简单的样例分析<em>可变参数函数</em>的实现rnrn以下分析中的地址标示在不同的机器可能不一样。rn先看一下可变参数的函数实例:rnrnvoid Test1(int num, ...)rnrn int sum = 0;rnrn va_list argList;rn va_start(argList, num);rn for (int i = 0; i < num; i++)rn rn sum += va_arg(argList, int);rn rn va_end(argList);rnrn printf("Sum is %d\n", sum);rnrnrn//call function:rnint main(int argc, char* argv[])rnrn Test1(3, 1, 2, 3);rn rnrn在Window平台(win32/Intel)通常的编程情况下, va_list, va_start, va_arg, va_endrn定义如下(见):rn#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )rnrntypedef char * va_list;rnrn#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )rn#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )rn#define va_end(ap) ( ap = (va_list)0 )rnrn(1)说明:rn_INTSIZEOF(n) : 以sizeof(int)为基本单位使用进一法计算变量n的size,所得结果再乘以rn sizeof(int)rnva_start(ap,v): 根据第<em>一个</em>参数的地址以及大小获取后<em>一个</em>参数的地址rnva_arg(ap,t) : 根据所给的类型参数t获取当前参数的值,并将va_list的指针向后移动该rn 参数大小指向下<em>一个</em>参数rnva_end(ap) : 将va_list指针设为0(无效),避免野指针rnrn(2)函数<em>调用</em>方式:rnC/C++默认的__cdcl<em>调用</em>方式:从右向左压栈rnrn根据上面的知识我们就可以很轻松的解释Test1()多参数函数<em>调用</em>的秘密。rnmain()<em>调用</em>Test1(3, 1, 2, 3), 汇编如下:rn89: Test1(3, 1, 2, 3);rn0040DB88 push 3rn0040DB8A push 2rn0040DB8C push 1rn0040DB8E push 3rn0040DB90 call @ILT+55(Test1) (0040103c)rn0040DB95 add esp,10hrnrn函数压栈后,可能的堆栈分布如下:rn0X100C 3rn0X1008 2rn0X1004 1rn0X1000 3rnrn在Test1(int num, ...)中rn<em>调用</em>:rnva_list argList;rnva_start(argList, num);rn得:argList -- 0X1004rnrn第一次<em>调用</em>:int var = va_arg(argList, int);rnargList -- 0X1008rnvar = 1rn...rn如此循环,从而获取所有的参数rnrn在上述知识的前提下, 我们再来看如下例子:rnvoid Test2(int& first, ...)rnrn int sum = 0;rnrn va_list argList;rn va_start(argList, first);rnrn for (int i = 0; i < first; i++)rn rn sum += va_arg(argList, int);rn rn va_end(argList);rnrn printf("Sum is %d\n", sum);rnrn在main()中<em>调用</em>:rnrn int cnt = 3;rn Test2(cnt, 1, 2, 3);rnrn得出的结果竟然是:5445018 ????rn问题出在什么地方?rn我们参考:va_start(ap, v)宏的定义:rn#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )rn当参数中包含对某个变量的引用时,ap获得地址将不是参数在堆栈中的地址,而是被传入rn的变量的地址,上例中为cnt的地址。这个时候ap已经成为野指针,极有可能会导致极为rn严重的bug产生。rn可以做如下测试:rnvoid Test2_1(int& first, ...)rnrn // 获取first在堆栈中的地址rn int* pN1 = NULL;rn __asm lea eax,first;rn __asm mov pN1,eax;rnrn int sum = 0;rnrn va_list argList;rn va_start(argList, first);rn // 可以注意到argList的地址为传入函数的&cnt+4rnrn for (int i = 0; i < first; i++)rn rn sum += va_arg(argList, int);rn rn va_end(argList);rnrn printf("Sum is %d\n", sum);rnrn在main()中<em>调用</em>:rn // 注意cnt的地址 = 0x0012ff7crn Test2_1(cnt, 1, 2, 3);rn察看变量的值,可以知道:rn参数first在堆栈中的地址为:pN1 = 0x0012ff18rnargList的地址为:0x0012ff80 = 0x0012ff18 + sizeof(first)rnrn遇到这种情况可以自行实现va_start(ap, v),可以参考rnms-help://MS.MSDNQTR.2003FEB.2052/enu_kbvisualc/en-us/visualc/Q119394.htmrn给出的一种实现 rn#define va_start(ap,v) int var= _INTSIZEOF(v); \ rn __asm lea eax,v __asm add eax,var __asm mov ap,eax \ rn rnrn参考文档:rnms-rnrnhelp://MS.MSDNQTR.2003FEB.2052/vclib/html/_crt_va_arg.2c_.va_end.2c_.va_start.htmrnms-help://MS.MSDNQTR.2003FEB.2052/enu_kbvisualc/en-us/visualc/Q119394.htm
JS可变参数使用
假设使用函数 test(0,1,2)   如果函数原型为: function test(data) { console.info(data) console.info(arguments.length) for(var i = 0; i&amp;lt;arguments.length; i++) console.info(arguments[i]) }   输出 0,3,1,2,3...
如何写“可变参数函数
个人学习笔记,简单的实例加明了的说明,看了就应该能自己写出<em>可变参数函数</em>。
可变参数函数(摘抄)
这篇博文是网上找到的,关于<em>可变参数函数</em>的解析。
C++可变参数函数
C++<em>可变参数函数</em>的三种实现方法:C风格实现,基于initializer_list,和基于模板。三种实现方法的比较和优缺点总结。
开发可变参数函数
(             开发<em>可变参数函数</em> 在c语言中,可变参数的函数极其常见,如常用的printf()。<em>可变参数函数</em>的一般形式如下: 返回值类型 函数名(类型1 参数1,类型2 参数2,...类型n 参数n,...);如上所示,这是<em>一个</em>典型的可变参数样式,它共有n个确定的参数,最后的...表示可变参数的含义。必须指出...必须位于最后,并且它至少要有<em>一个</em>确定的参数,原因后面陈述
可变参数函数stdarg
#include #include int add(int pre,...) { va_list arg_ptr; int sum = pre; int argValue; va_start(arg_ptr,pre); do { argValue=va_arg(arg_ptr,int); sum+=arg
Go-181006-可变参数函数
Problem 奇技淫巧的 Go,特别 Mark 一篇写的很详细的文章,关于go的<em>可变参数函数</em>! Reference Go 语言“<em>可变参数函数</em>”终极指南
C++ 可变参数函数
函数的可变参数必须用到  默认<em>调用</em>约定  __cdecl 采用与unix兼容模式下的申明方式时,参数个数可变的函数原型为 type functionname(va_alist); 但实现时必须是 /* UNIX兼容形式*/ int funcationname(va_alist) va_dcl { } 使用方法 int addFunc(int fi
java的可变参数函数
<em>可变参数函数</em>的声明: public void test(int... intarray){ } 也可以: public void test(int a,String s,int... intarray){ } 可变参数一定要放在参数列表的最后一项 这位博主总结的挺好的,多看一下java可变参数
C可变参数函数
转自:http://www.yuanma.org/data/2008/0504/article_3027.htm内容摘要 本文从程序员实践的角度来剖析C<em>可变参数函数</em>在Intel 32位CPU上的实现与原理 本文从程序员实践的角度来剖析C<em>可变参数函数</em>在Intel 32位CPU上的实现与原理作者:林海枫http://blog.csdn.net/linyt[*]欢迎转载,但请完整
c++可变参数函数
C++允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“…”代替。“…”告诉编译器,在函数<em>调用</em>时不检查形参类型是否与实参类型相同,也不检查参数个数。 例如: void ConnectData(int i,...) 在上面的代码中,编译器只检查第<em>一个</em>参数是否为整型,而不对其他参数进行检查。
va_start可变参数函数
void va_start(va_list ap, last); //变参起始地址 type va_arg(va_list ap, type); //下<em>一个</em>参数的地址 void va_end(va_list ap); void va_copy(va_list dest, va_list src);举例#include #include void func(co
如何写——可变参数函数
总共分为5个记忆点:函数原型声明写法、定义参数变量、初始化参数变量(的偏移)、给类型取参数、取参数完毕 函数原型声明写法type fun(xx,xx,xx,int arg_num,...) 定义参数变量 va_list arg; 初始化参数变量(的偏移)va_start(arg,arg_num) 给类型取参typevalue value = va_arg(arg,ypevalue); 取参数完
c 可变参数函数
捣鼓一些事情,跟c库函数int open(const char *pathname, int flags, …)打交道,也有一丢丢像open()一样实现可变参数的需求。因此了解了下c中的<em>可变参数函数</em>。 主要涉及va_list, va_start, va_arg, va_end和C99扩展可变参数宏__VA_ARGS__,网上资料很多了,这里只想记下计算可变参数个数的小trick,参考了这篇Over
可变参数函数使用
int TestVarParameter(int num, ...)rnrn int sum = 0;rn int n;rn n = num; rnrn va_list ptr;rn va_start(ptr, num);rnrn while(n!=0)rn rn sum += (n*n)rn n = va_arg(ptr, num);rn rn rn va_end(ptr);rnrn return sum;rnrnrn我的函数结果总是不对,不知道什么原因?总是得出8位长的数字 例如:36982647rn希望大家帮我看看,小弟谢谢了,对这个可变的参数函数确实有的不太会用。[color=#0000FF][/color]rnrn
PHP7扩展开发-调用自定义函数,使用可变参
php7扩展开发之<em>调用</em>用户自定义函数,使用可变参 假设php中的函数原型:function calltask(callable $func[, mixed $arg1[, ...]]);第<em>一个</em>参数是必须的,表示函数名,其他参数是可选参数。 扩展中的实现方式:/* proto function calltask(callable $func[, mixed $arg1[, ...]]);*/ PH
java中可变参数函数的重写
问题有点难描述,看以下代码:rn[code=Java]class A rn public void ma(String... names) rn System.out.println("Class A");rn rnrnrnclass B extends A rn // 这里的参数如果是String[] names或String...names,最终输出结果是Class Brn public void ma(String names) rn System.out.println("Class B");rn rnrnrnpublic class TestVarargs rn public static void main(String[] args) rn A a = new B();rn a.ma("Tom");// 这里<em>调用</em>的为什么是A中的函数?最好能描述一下对象在内存中的情况rn rnrn[/code]rn最终输出结果是Class A;也就是a.ma("Tom");这里<em>调用</em>的是A中的函数。求解!!!如果有相关材料解答也可以告诉我,谢谢啦
可变参数函数示例
演示如何使用参数个数可变的函数,采用ANSI标准形式 #include ; #include ; #include ; /* 函数原型声明,至少需要<em>一个</em>确定的参数, 注意括号内的省略号 */ int demo( char *, ... ); void main( void ) { demo("DEMO", "This", "is", "a", "de
强连通分量及缩点tarjan算法解析
强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的<em>一个</em>点也是<em>一个</em>连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Time, DFN[N], Low[N]; DFN[i]表示 遍历到 i 点时是第几次dfs Low[u] 表示 以u点为父节点的 子树 能连接到 [栈中] 最上端的点   int
基于hibernate 通用查询框架,包含查询、分页列表 功能下载
csdn目前有点不稳定,如果不能下载请登入我的网站下载:http://hi.baidu.com/jfheng 刚刚整理完的API : http://download.csdn.net/source/670910 说明文档中遗漏说明(复选框、主键超链用法): http://hi.baidu.com/jfheng/blog/item/4a633e005624e981e850cd5d.html Awake框架hql解析模块,支持Hql子查询的用法: http://hi.baidu.com/jfheng/blog/item/96ad1852d338a4080cf3e318.html 上面有最 相关下载链接:[url=//download.csdn.net/download/jfheng/669939?utm_source=bbsseo]//download.csdn.net/download/jfheng/669939?utm_source=bbsseo[/url]
Windows7部署Android开发环境傻瓜式教程(Eclipse + ADT)下载
分享一下 Windows7部署Android开发环境傻瓜式教程(Eclipse + ADT).pdf 相关下载链接:[url=//download.csdn.net/download/aaaaas2008/2191883?utm_source=bbsseo]//download.csdn.net/download/aaaaas2008/2191883?utm_source=bbsseo[/url]
表格动态增加删除,第一列自动延长不增加新内容下载
表格默认5行,点按钮动态增加删除行,但是左边第一列和右边最后一列自动延长,不增加内容,其它单元格增加一个输入框,反正都可以改的,供大家参考 相关下载链接:[url=//download.csdn.net/download/kon220/2275277?utm_source=bbsseo]//download.csdn.net/download/kon220/2275277?utm_source=bbsseo[/url]
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 如何在网页制作中加入视频 如何在网页制作中插入视频
我们是很有底线的