展开

关键词

va_start va_arg va_end 的原理与实例

//int i = va_arg( ap, int );       //如果有多个参数继续调用va_arg       /****** Step 3 ******/       va_end #define va_arg _crt_va_arg #define va_end _crt_va_end #define  _crt_va_start(ap,v)    ( ap = (va_list va_end(arg_ptr):清空参数列表,并置参数指针arg_ptr无效。说明:指针arg_ptr被置无效后,可以通过调用 va_start()、va_copy()恢复arg_ptr。 每次调用va_start() / va_copy()后,必须得有相应的va_end()与之匹配。参数指针可以在参数列表中随意地来回移动,但必须在va_start() … va_end()之内。 va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。

89130

举例分析可变参数函数实现的过程

; va_start(args,n); for(int i = 0;i<n;++i) { sum += va_arg(args,int); } va_end (3)va_end #define va_end(ap) (ap = (va_list)0) ap = (char*)0 = NULL; va_end宏的作用: 参数类型: ap为va_list类型的指针 实际上通常va_start与va_end是配对使用。 了解并掌握以上三个宏的使用方法以及函数栈调用的规则后。 获取可变参数列表中的第一个参数的地址并保存在p内 va_start(p,n) for(int i = 0;i<n;++i) { sum += va_arg(args,int); } va_end

4320
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    研究一下未知参数的方法

    参考文献地址 http://blog.csdn.net/edonlii/article/details/8497704 va_list参考文献地址 va_start参考文献地址 va_copy参考文献地址 va_end 是接受除第一个参数之外的其余参数数组 取值的步骤如下 利用va_list初始化一个c语言的数组 使用va_start进行参数接受 利用va_arg进行超找参数 参数的类型必须和接受的类型一致 是c语言的类型 利用va_end 如果不存在就退出循环 break; } NSLog(@"%@",arg); // 输出其他参数 } } va_end (list); // 结束查找 一定要写va_end } 我们就可以调用这个函数了 [self vaList:@"1",@"2",@"3",nil]; 输出 2016-12-15 14:12:32.634

    27910

    C语言可变参数的原理和应用

    语言中解决变参问题的一组宏,原型: typedef char* va_list; 其实就是个char*类型变量 除了var_list ,我们还需要几个宏来实现可变参数 「va_start、va_arg、va_end //第一个可选参数地址 #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )//下一个参数地址 #define va_end va_start(ap, v); while (i > 0) { ReturnValue += va_arg(ap, int); i--; } va_end = 0; va_copy(argsCopy, args); length = vsnprintf(NULL, 0, fmt, argsCopy); va_end , ...) { va_list va; va_start(va, fmt); InteropCallback(data, level, ctx, fmt, va); va_end

    50920

    C语言函数不定参数实现方式

    并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数. (4)va_end(arg_ptr) 清空参数列表, 并置参数指针arg_ptr无效. const char *args1; 9 va_start(args, format); 10 args1 = va_arg(args,const char *); 11 va_end const char *args1; 10 va_start(args, format); 11 args1 = va_arg(args,const char *); 12 va_end format); 10 args1 = va_arg(args, const char *); 11 args2 = va_arg(args, const char *); 12 va_end va_list args; 4 int args1; 5 va_start(args, format); 6 args1 = va_arg(args, int); 7 va_end

    93340

    实现一个在JNI中调用Java对象的工具类,从此一行代码就搞定!

    va_start(args,methodSig); jobject result = (*env).CallObjectMethodV(obj, methodID, args); va_end va_start(args,methodSig); jboolean result = (*env).CallBooleanMethodV(obj, methodID, args); va_end va_end(args); return *result; } 这样只要调用callMethod<return type>即可,愿望很美好,但是上面代码实际上是无法通过编译。 va_end(args); return *result; } 注意这行代码: if(typeid(jobject) == typeid(jdouble)){ result = ( .CallDoubleMethodV(obj, methodID, args); void *p = &doub; result = (T*)p; } va_end

    12520

    C++可变参数

    va_list ap; va_start(ap, num); for (int i = 0; i < num; i++) { cout<<va_arg(ap,int)<<endl; } va_end 在使用可变参数时必须要用到三个库函数va_start()、va_arg()和va_end()。使用这三个函数时,必须包含“stdarg.h”(C风格)或者“cstdarg”(C++风格)。 函数va_end()只有一个参数,该参数必须与函数va_start()的第一个参数相同。该函数的作用是做好取可变实参的收尾工作,以便参数个数可变的函数能够正常返回。 (2)必须使用函数va_start()来初始化可变参数,为取第一个可变参数做好准备工作;使用函数va_arg()依次取各个可变参数值;最后用函数va_end()做好结束工作,以便能正确地返回。

    1.2K20

    C语言-函数的可变形参(不定形参)

    //开始 void va_copy(va_list dest, va_list src); //拷贝 type va_arg(va_list ap, type); //取具体形参—取值 void va_end /* char */ c = (char) va_arg(ap, int); printf("char %c\n", c); break; } va_end va_start(ap, fmt); //指针地址赋值--初始化 //将参数列表里所有参数,按照格式化转换成字符串-存放到str指向的空间 vsprintf(buff,fmt,ap); va_end /* float */ f = va_arg(ap, double); printf("浮点数:%f\n", f); break; } } va_end va_arg(ap,int)); printf("提取字符:%c\n",va_arg(ap,int)); printf("提取字符:%lf\n",va_arg(ap,double)); va_end

    11210

    linux下C语言实现写日志功能

    ) { va_list ap; int retval; va_start(ap, fmt); retval = safe_vasprintf(strp, fmt, ap); va_end(ap); return pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end

    29231

    C++工程中常用的宏定义(#define)

    CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE); printf("%s", buf); fflush(stdout); va_end 1] = {0}; va_list ap; va_start(ap, format); vsnprintf(buf, kMaxLogLen, format, ap); va_end 1] = {0}; va_list ap; va_start(ap, format); vsnprintf(buf, kMaxLogLen, format, ap); va_end

    1.8K60

    C++工程中常用的宏定义(#define)

    CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE);     printf("%s", buf);     fflush(stdout);     va_end 1] = {0};     va_list ap;     va_start(ap, format);     vsnprintf(buf, kMaxLogLen, format, ap);     va_end 1] = {0};     va_list ap;     va_start(ap, format);     vsnprintf(buf, kMaxLogLen, format, ap);     va_end

    49220

    【C语言笔记】变参函数

    ; 【第二步】在函数定义中创建一个va_list类型的变量,用于存储不定的参数; 【第三步】用宏va_start把该变量初始化为一个参数列表; 【第四步】用宏va_arg访问参数列表; 【第五步】用宏va_end 这里第二个参数是double类型,传入的不定参数就应是double类型 */ sum += va_arg(ap, double); } /*【第五步】:使用va_end完成清理工作 */ va_end(ap); return sum; } int main(void) { double sum1 = 0, sum2 = 0; /* 计算 */ sum1 = sum

    35440

    C++字符串格式化

    num_of_chars + 1);     }     vsprintf_s((char *)tmp.data(), tmp.capacity(), _Format, marker);     va_end num_of_chars + 1);     }     vswprintf_s((wchar_t *)tmp.data(), tmp.capacity(), _Format, marker);     va_end

    12520

    vmalloc函数

    while (n) { struct vmap_area *tmp; tmp = rb_entry(n, struct vmap_area, rb_node); if (tmp->va_end vmap_area, list); } found: if (addr + size > vend) goto overflow; va->va_start = addr; va->va_end parent = *p; tmp_va = rb_entry(parent, struct vmap_area, rb_node); if (va->va_start < tmp_va->va_end ) p = &(*p)->rb_left; else if (va->va_end > tmp_va->va_start) p = &(*p)->rb_right; else spin_lock(&vmap_area_lock); vm->flags = flags; vm->addr = (void *)va->va_start; vm->size = va->va_end

    51510

    理解snprintf()函数

    format, ...) { va_list ap; va_start(ap, format); int expected = fix_vsnprintf(str, size, format, ap); va_end expected = 10240; // expected的大小不包含结尾符,所以在分配内存时需要加一 delete []buffer; buffer = new char[expected + 1]; va_end (ap); va_start(ap, format); vsnprintf(buffer, static_cast(expected + 1), format, ap); } va_end(ap); DeleteHelper

    72020

    基础知识 | 每日一练(117)

    , FILE *fp2, char *fmt, ...) { va_list argp; va_start(argp, fmt); vfprintf(fp1, fmt, argp); va_end (argp); va_start(argp, fmt); vfprintf(fp2, fmt, argp); va_end(argp); } 这里的 f2printf() 就跟 fprintf(

    1553029

    基础知识 | 每日一练(118)

    , FILE *fp2, char *fmt, ...) { va_list argp; va_start(argp, fmt); vfprintf(fp1, fmt, argp); va_end (argp); va_start(argp, fmt); vfprintf(fp2, fmt, argp); va_end(argp); } 这里的 f2printf() 就跟 fprintf(

    1773129

    基础知识 | 每日一练(134)

    = NULL) len += strlen(p); va_end(argp); retbuf = malloc(len + 1); /* +1 包含终止符 \0 */ if(retbuf == = NULL) (void)strcat(retbuf, p); va_end(argp); return retbuf; } 调用如下: char *str = vstrcat("Hello,

    2362929

    C:基于可以自动扩展缓冲区的stringbuffer,实现内存格式化输出(bufprintf)

    /* 输出缓冲区的起始地址从 offset 开始 */ int wsz = vsnprintf(pbuf->buffer + pbuf->offset, bufsz, fmt, args); va_end /** 计算实际需要的数据长度 */ wsz = vsnprintf(NULL, 0, fmt, args1); char *output = ensure(pbuf, wsz); va_end offset; va_list args2; va_start(args2, fmt); wsz = vsnprintf(output, bufsz, fmt, args2); va_end pbuf->offset; va_list args; va_start(args, fmt); wsz = vsnprintf(output, bufsz, fmt, args); va_end

    7020

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券