首页 > 编程语言 >【c&c++】可变参数:va_list(),va_start(),va_arg(),va_end() 详细解析

【c&c++】可变参数:va_list(),va_start(),va_arg(),va_end() 详细解析

时间:2024-02-08 12:33:04浏览次数:33  
标签:va end args list 列表 参数 可变 arg

目录

1、含义:

2、使用:

3、连续打印出自定义格式的文字:

1、含义:
(1)va_list是C语言中的一个宏定义,用于表示一个变长参数列表。它是一个指向变长参数列表的指针,可以通过宏va_start、va_arg和va_end对变长参数列表进行访问和操作。在函数中需要接收不定数量的参数时,可以使用va_list来处理这些参数。

(2)va_start:是一个宏定义,用于在使用可变参数函数时获取可变参数的起始地址。
它的作用是初始化一个va_list类型的变量,使其指向可变参数列表的第一个参数。
va_start宏需要两个参数,分别是一个va_list类型的变量和可变参数的最后一个固定参数的地址。

(3)va_arg:是一个宏,用于获取可变参数列表中的下一个参数值;

va_arg(ap, type)

其中,ap 是 va_list 类型的可变参数列表指针,type 是要获取的参数的类型。va_arg 宏返回指定类型的参数值,并将可变参数列表指针 ap 向后移动到下一个参数。注意,调用 va_arg 宏之前必须先调用 va_start 宏初始化可变参数列表指针。

(4)va_end:是一个宏,用于结束使用 va_start 和 va_arg 宏定义的可变参数列表。它的作用是清理 va_list 类型变量,以便该变量可以被再次使用。

2、使用:

//C
#include <stdio.h>
#include <stdarg.h>
 
void print_args(int num_args, ...) 
{
    va_list args;
    int i;
 
    va_start(args, num_args);  // 初始化args,指向可变参数列表的第一个参数
 
    for (i = 0; i < num_args; i++) 
    {
        printf("%d ", va_arg(args, int));  // 依次获取可变参数列表中的参数
    }
 
    va_end(args);  // 结束args的使用
}
 
 
int main() 
{
    print_args(3, 1, 2, 3);  // 输出:1 2 3
    return 0;
}

在上述示例中,print_args函数接受一个整数num_args和一个可变参数列表。在函数内部,使用va_list定义一个args变量,并使用va_start初始化args,指向可变参数列表的第一个参数。然后使用va_arg依次获取可变参数列表中的参数,并使用va_end结束args的使用。

3、连续打印出自定义格式的文字:

string format(const char * pFmt, ...)
{
#define FORMAT_MSG_BUFFER_SIZE (2048000)
    char szBuffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 };
    va_list args;
    va_start(args, pFmt);
    vsnprintf(szBuffer, FORMAT_MSG_BUFFER_SIZE, pFmt, args);
    va_end(args);
 
    std::string strRet = szBuffer;
    return strRet;
}

(1)format函数是一个可变参数函数,第一个参数pFmt是一个格式化字符串,后面的参数可以是任意数量的参数,用于填充格式化字符串中的占位符。该函数将格式化字符串和参数组合成一个新的字符串并返回。

例如,如果格式化字符串为"Hello, %s! Today is %d/%d/%d.",后面的三个参数分别为"World"、"10"和"2021",那么该函数返回的字符串为"Hello, World! Today is 10/2021."。

注意:在使用该函数时,需要注意保证格式化字符串和参数的类型和数量匹配,否则可能会导致程序崩溃或输出错误的结果。

(2)vsnprintf 是一个函数,用于将格式化的字符串输出到指定的缓冲区中,其参数列表中包含一个可变参数列表。与 printf 类似,vsnprintf 可以根据格式化字符串中的占位符,将后续参数转换成对应的字符串并输出到缓冲区中,但是与 printf 不同的是,vsnprintf 可以指定输出的最大长度,以避免缓冲区溢出的问题。

标签:va,end,args,list,列表,参数,可变,arg
From: https://www.cnblogs.com/opensmarty/p/18011713

相关文章

  • Java中的审批流:BPMN与Flowable
    最近闲来无事,研究了一下工作流框架。找到了一条可以实现审批流程的技术方向。我选择的后端工作流框架是Flowable,看文档应该是属于Activity的一个分支吧。使用教程文档地址在:GettingStarted·FlowableOpenSourceDocumentation(用百度/必应搜索,搜到的是Flowable的官网,最后这个......
  • Java反射(learning)
    Java-reflectionJava反射(Reflection)是Java语言的一个特性,它允许程序在运行时检查和修改内部类的行为。通过反射,可以获取类的构造器、方法、字段等成员的信息,并且可以动态地创建对象、调用方法、访问和修改字段。Java反射主要涉及到以下几个类:java.lang.Class:代表一个类,每个......
  • 解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件
    本文分享自华为云社区《服务运行时动态挂载JavaAgent和插件——Sermant热插拔能力解析》,作者:华为云高级软件工程师栾文飞一、概述Sermant是基于Java字节码增强技术的无代理服务网格,其利用Java字节码增强技术,为宿主应用程序提供服务治理功能,以解决大规模微服务场景中的服务治理......
  • Avalonia 越来越流行了,记录练手一个项目.就下载bing的图片吧
     只要有桌面需求那肯定掏出万年winform..偶然接触到了Avalonia把去年练手的项目整理了一下不知道大家练手都写什么...总的来说xaml习惯和wpf差不多.对于我这种经常写前端的后端来说.Avalonia支持css写法很省事. 技术栈Avalonia0.10.18NET7CommunityToolkit.Mvvm......
  • 深入理解 Java 循环结构:while、do while、for 和 for-each 循环
    Java循环循环可以执行一个代码块,只要达到指定的条件。循环很方便,因为它们节省时间,减少错误,并使代码更易读。JavaWhile循环while循环会循环执行一个代码块,只要指定的条件为真:语法while(condition){//要执行的代码块}在下面的示例中,只要变量(i)小于5,循环中的代码将......
  • offline 2 online | Cal-QL:校准保守 offline 训出的 Q value,让它与真实 reward 尺度相
    论文标题:Cal-QL:CalibratedOfflineRLPre-TrainingforEfficientOnlineFine-Tuning.NeurIPS2023,5566poster;ICLRRRLworkshop2023spotlight(神秘),两个4:Goodpaper,strongaccept。应该是先投的ICLRworkshop再投的NeurIPS2023吧…pdf:https://arxiv.org/pd......
  • Java 中的Collections工具类
    Collections工具类java.util.Collection集合接口java.util.Collections集合工具类,方便集合操作对List集合中元素排序,需要保证List集合中元素实现了Comparable接口Collections.synchronizedList(list);设置成线程安全的Collections.sort(wuGuis);进行排序importjava......
  • Sparse Table Advanced Skills
    Storeatupleof(valueofmaximum,indexofmaximum,valueofthesecondmaximum).Tomergetwosegments,wecompareiftheindicesofthemaximumsarethesame.Theycanpossiblybethesamebecauseweoftenqueryintersectingsegmentsinthesparsetab......
  • UVA10225 Discrete Logging 题解
    题目传送门前置知识大步小步算法题意多组询问,每次询问依次给定\(p,a,b\),求\(a^{x}\equivb\pmod{p}\)的最小非负整数解,其中\(a,p\)互质。解法BSGS板子题,不做过多介绍。貌似本题比P3846[TJOI2007]可爱的质数/【模板】BSGS和BZOJ3239DiscreteLogging数据较强......
  • javascript 下载 application/octet-stream 文件
    functiondownloadFile(id){varxhr=newXMLHttpRequest();xhr.open('POST','https://localhost/api/app/isp-detection/'+id+'/download');xhr.responseType='blob';xhr.setRequestHeader('Cont......