我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言中不定参数 ... 的语法以及函数封装

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言中不定参数 ... 的语法以及函数封装

Intro

有一天看C代码看到某个方法有这样的定义:在函数形参列表处,有...的写法,就像Java中的不定参数那样。
如:

int	 printf(const char * __restrict, ...) __printflike(1, 2);
int	 scanf(const char * __restrict, ...) __scanflike(1, 2);

那么C语言中的不定参数特性,是怎样使用的呢,以及我们如何利用该特性,封装自己的函数?

语法测试

依赖库

需要用到 stdarg.h 中的三个函数:

#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap)          __builtin_va_end(ap)
#define va_arg(ap, type)    __builtin_va_arg(ap, type)

新函数使用测试:遍历并打印不定参数中的值

主要是测试一下上面提到的三个库函数的使用。

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

// 声明列表的结束值
#define ARGUMENTS_END_VALUE -1

void printMultiArgs(int firstArgs, ...) {

    // 声明参数列表的变量
    va_list ap;
    
    // 初始化参数列表
    va_start(ap, firstArgs);
    printf("%d\n", firstArgs);
    
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        printf("%d\n", currValue);
    }

    // 结束参数列表
    va_end(ap);
}

int main(int argc, const char * argv[]) {
    printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
    return 0;
}

用两种方式封装函数:对多个int值求和

//
//  main.c
//  C不定参数
//
//  Created by wuyujin1997 on 2023/1/23.
//

//#define va_start(ap, param) __builtin_va_start(ap, param)
//#define va_end(ap)          __builtin_va_end(ap)
//#define va_arg(ap, type)    __builtin_va_arg(ap, type)

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

// 声明列表的结束值
#define ARGUMENTS_END_VALUE -1

void printMultiArgs(int firstArgs, ...) {

    // 声明参数列表的变量
    va_list ap;
    // 初始化参数列表
    va_start(ap, firstArgs);
    printf("%d\n", firstArgs);
    
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        printf("%d\n", currValue);
    }

    // 结束参数列表
    va_end(ap);
}


/// 对多个int变量求和(需要提前约定好参数结束的标志值 ARGUMENTS_END_VALUE)
/// - Parameter firstArgs: <#firstArgs description#>
int sum1(int firstArgs, ...) {
    int result = 0;
    
    va_list ap;
    va_start(ap, firstArgs);
    result+= firstArgs; // 手动处理第一个参数
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        result += currValue;
    }
    va_end(ap);
    
    return result;
}


/// 对多个int变量求和(需要主动本方法:不定参数的个数是多少)
/// - Parameters:
///   - count: 不定参数的个数
///   - firstArgs: 第一个参数,显式的形参
int sum2(int count, int firstArgs, ...) {
    int result = 0;
    
    va_list ap;
    va_start(ap, firstArgs);
    result += firstArgs;
    for (int i = 1; i < count; i++) {
        int currValue = va_arg(ap, int);
//        printf("%d  %d\n", i, currValue);
        result += currValue;
    }
    va_end(ap);
    
    return result;
}

int main(int argc, const char * argv[]) {

    printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
    printf("sum1  %d\n", sum1(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));
    int LENGTH = 9;
    printf("sum2  %d\n", sum2(LENGTH, 1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));

    return 0;
}

执行结果:

总结

  • 需要引入头文件 #include <stdarg.h>
  • 一个新类型,三个新函数
    • 类型 va_list
    • 函数,其中 ap 为 va_list 类型的变量。
      • va_start(ap, param) param为不定参数列表的第一个参数。
      • va_arg(ap, type) 不定参数中变量的类型吗,如int, short, long 等。
      • va_end(ap)
  • 如何确定 va_arg 的size/有多少个元素? 没有原生的属性/变量可以告诉我们。
    • 约定一个值作为 end_value ,而且要保证:这个值不会出现在传入的多个参数值中。
    • 在咱自己封装的函数中,新增一个参数用于告知被调函数内部:本次不定参数的size是多少。
  • 注意不定参数的类型匹配。

总结 

到此这篇关于C语言中不定参数 ... 的语法以及函数封装的文章就介绍到这了,更多相关C语言不定参数 ...内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言中不定参数 ... 的语法以及函数封装

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言中不定参数 ... 的语法以及函数封装

不定参数是指函数可以接收不确定个数的参数,下面这篇文章主要给大家介绍了关于C语言中不定参数 ... 的语法以及函数封装的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-28

C语言中函数宏封装的方式有哪些

本篇内容介绍了“C语言中函数宏封装的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 函数宏介绍函数宏,即包含多条语句的宏定义,
2023-07-05

C语言中函数的介绍及用法

本篇内容介绍了“C语言中函数的介绍及用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录函数定义库函数定义介绍Example 1 strc
2023-06-20

C语言函数分类自定义参数及调用方法是什么

本篇内容主要讲解“C语言函数分类自定义参数及调用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言函数分类自定义参数及调用方法是什么”吧!1. 函数是什么?提到函数,我们最先想到的
2023-06-21

C语言中函数参数的入栈顺序

这篇文章主要介绍“C语言中函数参数的入栈顺序”,在日常操作中,相信很多人在C语言中函数参数的入栈顺序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中函数参数的入栈顺序”的疑惑有所帮助!接下来,请跟着小编
2023-06-17

详解C语言中函数宏的三种封装方式

函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。本文就来聊聊函数宏的三种封装方式吧
2023-03-20

C语言函数封装及变量的作用域实例分析

这篇“C语言函数封装及变量的作用域实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言函数封装及变量的作用域实例分析
2023-06-30

GO语言不固定参数函数与匿名函数的使用

本文主要介绍了GO语言不固定参数函数与匿名函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

c语言中bool函数的用法

c 语言中,bool 函数是一种布尔函数,返回 true 或 false 值。其语法为:bool 函数名(参数列表),可接受任意数据类型参数,根据参数值计算条件,返回 true(真)或 false(假)。它广泛用于逻辑测试、条件语句、循环控
c语言中bool函数的用法
2024-05-09

c语言中strstr函数的用法

strstr() 函数可搜索字符串中的子字符串,返回第一个匹配子字符串的指针或 null(未找到)。用法步骤如下:1. 从字符串开头搜索;2. 逐个字符比较,找到匹配项或到达字符串结尾;3. 找到则返回匹配字符指针,未找到则返回 null。
c语言中strstr函数的用法
2024-04-29

c语言中strlen函数的用法

strlen 函数用于获取字符串长度,它返回字符串中不包含 null 终止符的字符数。用法:strlen(str),其中 str 是要确定其长度的字符串。C 语言中的 strlen 函数问题:什么是 strlen 函数?回答:strle
c语言中strlen函数的用法
2024-05-08

c语言中函数的定义方法是什么

在C语言中,函数的定义通常包含以下几个部分:1. 返回类型:函数可以有不同的返回类型,如int、float、void等,用来表示函数返回的数据类型。2. 函数名:用来标识函数的名称,可以根据需要自定义。3. 参数列表:函数可以接受一定数量的
2023-09-29

go语言中不定参数指的是什么

这篇“go语言中不定参数指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言中不定参数指的是什么”文章吧。不定参
2023-07-05

Linux 中C语言getcwd()函数的用法

Linux 中C语言getcwd()函数的用法 先来看该函数的声明:#include char *getcwd(char *buf,size_t size);介绍: 参数说明:getcwd()会将当前工作目录的绝对路径复
2022-06-04

C语言中scanf函数的用法及注意事项

C语言中scanf函数的用法及注意事项作为C语言中最常用的输入函数之一,scanf函数在程序开发中具有重要的作用。它能够从标准输入流(键盘)中接收用户输入的数据,并将其存储到指定的变量中。本文将介绍scanf函数的用法以及一些需要注意的事
C语言中scanf函数的用法及注意事项
2024-02-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录