0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单学习一下可变参数函数

玩转单片机 来源:玩转单片机 作者:noah 2022-11-29 09:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近写一个项目用到一些自编框架,遇到函数输入参数不确定的问题,然后就在想有什么办法实现,下班后灵光闪现想到C语言的某个语法(本人时不时都会看一些博客文章,在需要的时候就会想在哪里见过某些东西),然后就凭记忆尝试输入搜索,最后找到了它--可变参数函数,参数数量可变的函数被称为可变参数函数(variable function)。

在框架的编写中,都会考虑很多东西,对于不确定的输入,使用可变参数函数也是个不错的解决方案,下面就来简单学习一下。

#include "stdio.h"
// 引入头文件
#include "stdarg.h"


// 可变参数函数, 第一个变量指定后边有多少个参数
void user_task_1(int NumofPara, ...)
{
  //用于for循环
  int i = 0;
  //用于打印变量
  int temp = 0;            


  //新建一个va_list类型的指针
  va_list pointer;


  //初始化指针,指针指向确定
  va_start(pointer, NumofPara);
  
  for( i = 0; i < NumofPara; i++ )
  {
    //用va_arg返回后续的可变参数, 类型是 int
    temp = va_arg(pointer, int);
    printf("item: %d
", temp);
    //同时,每次va_arg函数结束后,va_list指针指向下一位
  }
  //终结指针,释放内存
  va_end(pointer);
}


int main()
{
  user_task_1(3, 2, 3, 4);
}

更秀一点的操作可以配合回调函数使用,灵活调用需要触发的任务:

#include "stdio.h"
// 引入头文件
#include "stdarg.h"


void user_task(void (*task)(void), int NumofPara, ...)
{
  int i = 0;
  int temp = 0;            


  va_list pointer;


  va_start(pointer, NumofPara);
  
  for( i = 0; i < NumofPara; i++ )
  {
    temp = va_arg(pointer, int);
    printf("item: %d
", temp);
  }
  
  va_end(pointer);


  task();
}


void task(void)
{
  printf("this is my task
");
}


int main()
{
  user_task(task, 3, 2, 3, 4);
}

输出的结果如下图:

1ed38898-6f2a-11ed-8abf-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144553
  • 回调函数
    +关注

    关注

    0

    文章

    93

    浏览量

    12111

原文标题:C语言|可变参数函数

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    可变参数函数的实现原理

    ;);printf("%d, %c", i, j);不知道你注意过没有,printf函数参数个数是可变的,上面的第个例子只有1个参数,第
    发表于 10-21 22:18

    C语言——可变参数问题.

    *argv[]);  函数参数是argc和argv。   深入想一下,"只能在运行时确定参数形式",也就是说你没办法从声明中看到所接受的参数
    发表于 04-20 15:17

    C语言中可变参数的定义

    文章目录文章目的写代码的时候经常需要通过打印trace来debug代码,于是就有了自己封装个TRACE函数的想法。知识点(1)打印trace的时候每次需要打印的参数个数不是
    发表于 07-14 07:43

    简单概述一下窗口之间传递参数的机制

    简单概述一下窗口之间传递参数的机制–“张三去商店买烟”分解动作:谁?–张三去哪?–商店要干嘛?–买烟怎么去?–走路去结果?–张三得到烟窗口(A):张三信号(signal):想要买烟连接方式
    发表于 01-18 09:01

    怎么设计c语言的可变参数函数

    怎么设计c语言的可变参数函数
    发表于 10-27 07:10

    如何才能在51系统使用类似printf这样的可变参数的子函数呢?

    学习自己构造可变参数的子函数使用“...”,做参数。知道是用堆栈传递函数的,但是在keil中仿真
    发表于 10-30 08:27

    可变函数网络电路图

    可变函数网络电路图
    发表于 02-17 17:34 553次阅读
    <b class='flag-5'>可变</b><b class='flag-5'>函数</b>网络电路图

    指针作为函数参数

    指针作为函数参数 大多数C程序员开始使用指针时是用它们实现函数参数,所谓可变参数。为了理解
    发表于 07-29 11:49 2950次阅读

    关于深度学习最常用的10大激活函数详解

    那就让我们来整理一下深度学习中离不开的激活函数
    的头像 发表于 03-12 17:45 3748次阅读
    关于深度<b class='flag-5'>学习</b>最常用的10大激活<b class='flag-5'>函数</b>详解

    分享一下嵌入式 HarmonyOS 的学习思路

    在我拿到小熊派鸿蒙开发板后,首先按照教程,搭建了开发环境,体验了一下程序是如何进行编译和下载,以及初步了解了一下资料的架构。关于小熊派鸿蒙开发板的信息,可以戳这里开始学习 Harmony...
    发表于 12-22 19:02 9次下载
    分享<b class='flag-5'>一下</b>嵌入式 HarmonyOS 的<b class='flag-5'>学习</b>思路

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

    这篇文章介绍C语言函数的不定参数可变参数 形参,实现printf样的传参效果。
    的头像 发表于 08-14 09:58 3486次阅读

    简单一下多点触控协议

    前面简单聊了一下多点触控协议,接下来找个驱动来看看具体实现。目前市面上多点触控芯片用得比较多的主要是汇顶和敦泰。
    的头像 发表于 04-17 09:20 3405次阅读

    学习一下ARM的智能功率分配技术

    今天来学习一下ARM的“智能功率分配”(Intelligent Power Allocation)技术,下文中简称IPA。
    发表于 07-14 14:18 1732次阅读
    <b class='flag-5'>学习</b><b class='flag-5'>一下</b>ARM的智能功率分配技术

    如何实现个自己的printf函数代码?

    在C语言中,可变参数函数可变参数宏都允许函数或宏接受不定数量的
    发表于 09-06 14:20 1594次阅读
    如何实现<b class='flag-5'>一</b>个自己的printf<b class='flag-5'>函数</b>代码?

    python函数的万能参数

    我们通过简单的事例来展示一下函数的万能参数,我们先写个最
    的头像 发表于 07-17 14:56 849次阅读
    python<b class='flag-5'>函数</b>的万能<b class='flag-5'>参数</b>