【C】标准库 stdarg.h va_start

stdarg.h中三个宏va_start ,va_arg和va_end的应用 1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变 量是指向参数的指针. 2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第 一个可变参数的前一个参数,是一个固定的参数. 3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个 参数是你要返回的参数的类型,这里是int型. 4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使 立即下载

简介

C 标准库 stdarg.h 定义了一个变量类型(va_list)和三个宏(va_start,va_arg,va_end),
其中

  1. va_start(va_list ap, last_arg) 用来初始化 ap 变量, last_arg 代表传递给函数的最后一个已知
    固定参数,即在定义的可变参数列表中省略号之前的参数;
  2. va_arg(va_list ap, type) 用来检索参数列表中下一个 type 类型的参数;
  3. va_end(va_list ap) 能够使程序从用 va_start 引用变长参数列表的函数中正常返回,并清理 ap 占用的内存。

实例演示

#include<stdio.h>
#include<stdarg.h>

int sum(int, ...);

int main(void)
{
    printf("10、20和30的和为:%d\n", sum(3, 10, 20, 30));
    return 0;
}

int sum(int number_args, ...)
{
    int val = 0;
    int i;
    va_list ap;

    va_start(ap, number_args);
    for (i = 0; i < number_args; i++)
    {
        val += va_arg(ap, int);
    }
    va_end(ap);

    return val;
}

运行结果为
运行结果

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器 本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。 阅读详情

相关推荐

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2740

va_list、va_start和va_end使用

我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍为了理解这些宏的作用,我们必须先搞清楚:C语言中函数参数的内存布局。首先,函数参数是存储在栈中的,函数参数从右往左依次入栈。

木牛的博客 1917

433MHz无线通信避坑指南:如何解决信号干扰和误码问题

本文深入探讨433MHz无线通信中的信号干扰和误码问题,提供从射频前端设计到协议优化的全链路解决方案。通过天线匹配、电源噪声抑制、曼彻斯特编码改进及实时频点切换等技术,显著提升通信稳定性和距离。适合智能家居和工业无线控制系统的开发者参考。

weixin_29288313的博客 419

C库 —— <stdarg.h>

通过使用这些类型和宏,程序员可以编写灵活且通用的函数,支持接受不定数量和类型的参数。库的各个功能和用法,并提供了实际应用示例和图表描述,帮助读者深入理解和掌握这些功能。接受一个格式字符串和可变数量的参数,并将格式化后的消息打印到标准输出。可以接受格式字符串和可变数量的参数,并按指定格式打印消息。接受一个可变数量的字符串参数,并按指定的分隔符打印它们。接受一个可变数量的整数参数,并计算它们的总和。可以处理不同类型的参数,并计算它们的最大值。可以处理不同类型的参数,并计算它们的总和。

新华编程特战队 1814

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

别再手动盘点了!教你给微信小程序仓库系统加个‘扫码枪’:完整扫码入库与查询功能实现

本文详细介绍了如何为微信小程序仓库系统添加扫码入库与查询功能,实现零硬件成本的智能仓储管理。通过优化摄像头参数、增强动态识别算法和深度整合业务逻辑,提升扫码精度和效率,同时提供混合查询方案应对复杂场景。这套方案显著提升入库效率,降低错误率,适用于各类仓储管理需求。

weixin_30844577的博客 300

【嵌入式C语言】可变参数 va_start、va_arg、va_end、va_list、stdarg.h 库详解

可变参数详解 printf( )是我们在编程中避不开的函数,之前我们研究了printf( )的实现原理,初步了解了printf( )函数在库中是借用putchar( )来进行实现输出的,但是还有一个问题我们上一篇文章没有解决,那就是printf( )中的可变参数是怎么实现的呢,如何去使用可变参数完成我们自己的输出函数呢? 让我们再来看一眼printf( )的长相,在stdio.h文件中他是这样声明的 int printf(const char *format, ...) printf( )中分为两种参数,

物联网从你我开始 4107

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

C 标准库 <stdarg

频,并且后续会持续更新**

2401_84240431的博客 1418

Nano Banana 2哪里使用?Nano Banana 2提示词合集和使用教程

收集最强的Nano Banana 2提示词合集,以及Nano Banana 2哪里使用的教程,并且有10个免费使用渠道。

qq_42927225的博客 1996

硬件描述语言Verilog学习(一)

主要学习综合和仿真、模块结构和信号类型Verilog 是用代码的形式描述硬件的功能,最终在硬件电路上实现该功能。在 Verilog 描述出硬件功能后需要使用综合器对 Verilog 代码进行解释并将代码转化成实际的电路来表示,最终产生实际的电路,也被称为网表。这种将 Verilog 代码转成网表的工具就是综合器。 上图左上角是一段 Verilog 代码,该代码实现了一个加法器的功能。在经过综合器解释后该代码被转化成一个加法器电路。QUARTUS、ISE 和 VIVADO 等 FPGA 开发工具都是综合器,

安静到无声 1500

stdarg, va_start, va_arg, va_end, va_copy - variable argument lists

Synopsis #include <stdarg.h> void va_start(va_list ap, last);type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src); Description A function may be...

liyucheng987的博客 203

2026华为OD面试题029:勇攀数字高峰

在给定的数字地形图里寻找登山路径,数字代表当前位置的海拔高度。要求从最低海拔出发,不断攀登,最终到达最高山峰。地图保证最低海拔和最高山峰都只有一个。 登山规则: - 路径上的海拔必须严格递增 - 只能向上下左右 4 个方向移动 - 路径必须从最低海拔开始,到最高海拔结束 - 每个地点只能走一次 - 每一步的攀登高度差必须大于 0,且不超过指定值 `K` 输出满足条件的登山路径的数量。

琅嬛福地 121

C标准库stdarg.h库中的宏 va_start、va_arg、va_end

C标准库&lt;stdarg.h&gt;库中的宏 va_start、va_arg、va_end 介绍: stdarg.h头文件定义了一个变量类型va_list和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。可变参数的函数通在参数列表的末尾是使用省略号(...)定义的。 va_list : 这是一个适用于va_start()、va_arg()...

寂蝶难双,窃窃思羽. 1033

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

关于参数处理那点事,C标准库反汇编解析

访问无名参数(既没有命名也没有类型)的类型和宏

太白断水客 1167

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C 标准库 - <stdarg.h>

头文件定义了一个变量类型和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的。

2301_77019544的博客 374

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[C语言]利用stdarg.h来实现可变参数列表

参考资料: 1、MSDN, 查询 ... ellipsis 关键字; 2、http://www.cppblog.com/ownwaterloo/archive/2009/04/21/unacceptable_type_in_va_arg.html 3、http://blog

538

C语言细节 - 可变参数列表

背景: 在求同类型数据的平均值时,往往编写固定参数的函数实现,若想改变参数个数,需修改函数,这样非常麻烦,为此引入可变参数列表来解决这一问题 引入的头文件: 为了使用可变参数列表,你需要添加标准库中的 “stdarg.h” 一个类型: typedef char *va_list; va (variable-argument) :可变参数 三个宏: #define va_start(AP, LAST...

清风的博客 332

从浅到深的——可变参数处理头文件<stdarg.h>的超详细讲解(从运行到底层逻辑)

从入门到精通,全方位讲解可变参数处理头文件<stdarg.h>,本章内容是为了辅助讲解BIF函数的实现的。大家在学习本章内容的时候一定要完整阅读,按照顺序阅读哦。

taoqingbaiyi的博客 1773

129.【C语言】深入解析参数数量可变的函数

文章摘要:本文详细讲解了C语言中可变参数函数的实现原理,包括va_list、va_start、va_arg、va_end等关键宏的使用方法。通过FindMaxData示例代码展示了如何获取多个数的最大值,并深入分析了_INTSIZEOF宏实现4字节对齐的原理。文章还指出了使用可变参数时的注意事项,如必须顺序访问参数、需要至少一个命名参数等,最后布置手动实现printf函数的思考题。

zhangcoder的博客 记录学习轨迹~ 1234

使用stdarg.h实现可变长度参数

现在先用一个使用过程讲解一下: ◎用法:func( Type para1, Type para2, Type para3, … ){/****** Step 1 ******/va_list ap;va_start( ap, para3 ); //一定要“…”之前的那个参数 ,而且这个参数不能使引用类型,因为引用类型不能根据其地址获取后面参数的地址 /****** Step 2 **...

weixin_30892987的博客 65

五、 第5章 熟视无睹的标准库函数(2)(C语言高级应用篇 )

本文介绍了C语言标准库time.h中的时间处理函数,重点讲解了tm结构体的组成元素及其含义。详细说明了time()函数获取系统时间戳的原理,以及在嵌入式系统中的实现方法。文章还对比了gmtime()和localtime()函数的区别,解释了mktime()和difftime()函数的功能,并提供了时间差计算的示例。最后介绍了strftime()函数的格式化输出功能,列出了常用的时间格式说明符。这些内容为C语言中的时间处理提供了全面的参考。

神圣的大喵的博客 1194

c语言取出可变参数,C语言可变参数va_list

#include#include#include/*1.使用va_listva_startva_argva_end实现可变参数*/voidsimple_va_fun(inti,...){va_listarguments;intj=0;intk,m;va_start(arguments,i);j=va_arg(arguments,int);m=va_arg(a...

weixin_39622150的博客 277

C语言变长参数函数

一个函数可能包含不定个参数,定义了va_list类型并且定义了三个宏用来处理这些参数。

2301_79013454的博客 441

现代C: 标准库:非本地跳转与可变参数是怎样实现的?

在这个简单的实验中,我们将构建自己的 setjmp 与 longjmp 函数,并重新编译之前的 C 示例程序,来让它使用这两个函数的自定义实现。这里,我们将直接编写汇编代码,并在最后以对象文件的形式将它们链接到程序中使用。需要注意的是,下面我将要介绍的实现方式仅适用于 x86-64 平台。对于其他平台,使用的汇编指令以及需要保存的寄存器可能有所区别,但整体思路基本一致。setjmp:ret其中,前两行以 “.” 开头的语句为汇编器指令,它们用来指示汇编器应该如何处理接下来的汇编代码。

一个时代的落幕,一个时代的开启。 660

C可变长参数函数的几个宏的理解

// stdarg.h #define va_start _crt_va_start #define va_arg _crt_va_arg #define va_end _crt_va_end // vadefs.h typedefchar*va_list; #define _crt_va_start(ap,v) ( ap = (va_li...

weixin_30892037的博客 152
上一篇: 【elasticsearch】CentOS 7 安装 elasticsearch
下一篇: 【PHP】php 源码之宏 PHP_FUNCTION
November's  chopin
博客等级 码龄10年 10粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值