C++项目实战——基于多设计模式下的同步异步日志系统-②-相关技术补充(不定参函数)

news2024/9/30 21:36:58

文章目录

  • 专栏导读
  • 不定参函数
  • C++风格不定参函数
  • 不定参宏函数

专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C++项目——基于多设计模式下的同步与异步日志系统

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法Linux

在这里插入图片描述

不定参函数

C语言中的不定参数函数是一种特殊类型的函数,它允许你定义一个函数,可以接受不定数量的参数。这些函数通常用于处理不确定数量的输入,例如printfscanf等标准库函数,它们可以接受不同数量和类型的参数。

不定参函数的声明格式如下:

	return_type func_name (format_string, ...);
  • return_type为函数返回值类型;
  • func_name为函数名;
  • format_string是一个格式化字符串,用于指定参数的数量和类型;
  • ... 表示不定数量的参数;

在函数内部我们可以用一些宏或函数来对不定参数进行分解,常见的宏有va_startva_argva_end

    void va_start(va_list ap, last);
    type va_arg(va_list ap, type);
    void va_end(va_list ap);
  • va_list:va_list是一个类型,用于声明一个参数列表的对象,它的本质其实是void*;
  • va_start:用于初始化va_list对象,使其指向不定参数列表的第一个参数;
  • va_arg:用于获取不定参数列表中的参数;
  • va_end:用于清空可变参数列表;

示例1

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

void printNum(int count, ...)
{
    va_list ap;
    va_start(ap, count); // 初始化ap指针,使其指向不定参数列表的第一个参数
    for(int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int); // 从不定参数列表中抽取int类型的参数
        printf("%d ", num);
    }
    printf("\n");
    va_end(ap); // 将ap置空
}

int main()
{
    printNum(5, 1, 2, 3, 4, 5);
    return 0;
}

示例2

#define _GNU_SOURCE

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

void myprintf(const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    char* res;
    int ret = vasprintf(&res, format, ap);
    if(ret != -1)
    {
        printf(res);
        free(res); // res指向动态开辟的空间,需要手动释放
    }
    va_end(ap);
}
int main()
{
    myprintf("%s-%d\n", "huaxiangyun", 100);
    return 0;
}

注意
示例中vasprintf 是一个 C 库函数,它可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。它的使用方法与 printf类似,但它不会将结果打印到标准输出流中,而是将其存储在一个指向字符数组的指针中

函数原型如下:

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

int vasprintf(char **str, const char *format, va_list ap);

C++风格不定参函数

在C++中,有两种主要方式来创建不定参数函数:

  • C风格的不定参数函数:这种方式与C语言中的不定参数函数类似,使用了C标准库中的va_list、va_start、va_arg和va_end宏。这种方式在C++中仍然有效,但不够类型安全,不太推荐在现代C++代码中使用。

  • C++11引入的可变参数模板:这是更现代和类型安全的方式,使用了C++的模板和新的语法特性。可变参数模板允许你定义一个接受不定数量参数的函数,并且能够在编译时进行类型检查。这种方式更灵活,并且是C++推荐的方式。

示例3

#include <iostream>

// 无参特化
void xprintf()
{
    std::cout << std::endl;
}

template <typename T, typename ...Args>
void xprintf(const T &v, Args &&...args)
{
    std::cout << v;
    if((sizeof ...(args)) > 0)
    {
        xprintf(std::forward<Args>(args)...); // 递归分解参数包
    }
    else
    {
        xprintf();
    }
}

int main()
{
    xprintf("huaxinagyun");
    xprintf("aaaa", 1000);
    return 0;
}

不定参宏函数

示例4

#include <stdio.h>

#define LOG(format, ...) /
	printf("[%s : %d]\n", format, __FILE__, __LINE__, ##__VA_ARGS__)

int main()
{
    LOG("日志消息");
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…

【无线电力传输】12 V 直流风扇无线电力传输系统的实现(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为OD机试 - 最长的指定瑕疵度的元音子串 - 正则表达式(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

高速电路设计笔记----第一章

一、需求。 1、电路设计首先要做的是明确需求。 2、明确需求后需要对CPU进行选型、电源的选型、退耦电容选型。 3、画原理图需要兼顾PCB上的器件布局。中间电阻电容如果是靠近下一级&#xff0c;在原理图中画的时候也应该是靠近下一级处画。 4、按照PCB上电容的排列顺序绘制…

Java复习-25-单例设计模式

单例设计模式 目的&#xff08;使用场景&#xff09; 在实际开发下&#xff0c;会存在一种情况&#xff1a;某一种类在程序的整个生命周期中&#xff0c;只需要实例化一次就足够了。例如&#xff0c;系统数据类&#xff0c;由于操作系统只有一个&#xff0c;因此在程序初始化…

【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异

&#x1f4ad; 写在前面&#xff1a;本文将带您深入了解项目管理的核心概念和关键要素。我们将从项目管理的基本理解开始&#xff0c;逐步探讨其领域、复杂性和变化的重点&#xff0c;以及项目管理的具体过程。我们还将研究项目的性质以及成功项目所必备的条件。在此过程中&…

PandaGPT部署演示

PandaGPT 是一种通用的指令跟踪模型&#xff0c;可以看到和听到。实验表明&#xff0c;PandaGPT 可以执行复杂的任务&#xff0c;例如生成详细的图像描述、编写受视频启发的故事以及回答有关音频的问题。更有趣的是&#xff0c;PandaGPT 可以同时接受多模态输入并自然地组合它们…

ClickHouse 存算分离改造:小红书自研云原生数据仓库实践

ClickHouse 作为业界性能最强大的 OLAP 系统&#xff0c;在小红书内部被广泛应用于广告、社区、直播和电商等多个业务领域。然而&#xff0c;原生 ClickHouse 的 MPP 架构在运维成本、弹性扩展和故障恢复方面存在较大局限性。为应对挑战&#xff0c;小红书数据流团队基于开源 C…

C++提高篇:深入理解纯虚函数和抽象类

在C中&#xff0c;纯虚函数和抽象类是面向对象编程中重要的概念。本文将会深入探讨这两个概念的含义、如何定义和使用它们&#xff0c;以及它们在实际开发中的应用。 一、什么是纯虚函数&#xff1f; 在C中&#xff0c;纯虚函数是指在基类中声明但没有实现的虚函数。纯虚函数的…

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单 1. 难以解释的贪心算法 贪心学习法则&#xff1a;直接做题&#xff0c;不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时&#xff0c;在每一步选择中都采取最好或者最优&#xff08;最有利&#xff09;的选择&#xff0c;从而希望能够导致结果最…

zabbix -- 安装

Zabbix zabbix除了可以监控linux服务器之外&#xff0c;还可以监控路由器、交换机、容器等&#xff0c;全方位监控 Zabbix对服务器的监控是通过在服务器上部署“间谍”程序zabbix-agent获取数据&#xff0c;但对于路由器、交换机等机器的监控不能进行部署&#xff0c;这个时候…

空气净化器上亚马逊美国站需要办理什么认证?空气净化器UL867测试报告如何办理?

空气净化器又称“空气清洁器”、空气清新机、净化器&#xff0c;是指能够吸附、分解或转化各种空气污染物&#xff08;一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等&#xff09;&#xff0c;有效提高空气清洁度的产品&#xff0c;主要分为家用 、商用…

高忆管理:六连板捷荣技术或难扛“华为概念股”大旗

在本钱商场上名不见经传的捷荣技术&#xff08;002855.SZ&#xff09;正扛起“华为概念股”大旗。 9月6日&#xff0c;捷荣技术已拿下第六个连续涨停板&#xff0c;短短七个生意日&#xff0c;股价累积涨幅逾越90%。公司已连发两份股票生意异动公告。 是炒作&#xff0c;还是…

智能感测型静电消除器通常具备哪些特点

智能感测型静电消除器是一种利用高压电源产生的离子来中和空气中的静电&#xff0c;从而达到消除静电的目的的设备。它通过内置的感测装置来监测环境中的静电水平&#xff0c;并根据实时数据自动调节工作状态&#xff0c;以确保静电消除效果更好。 智能感测型静电消除器通常具…

Turf.js介绍

目录 1&#xff0c;使用场景2&#xff0c;安装 Turf.js3&#xff0c;在 Vue 3 组件中使用 Turf.js4&#xff0c;主要功能4.1&#xff0c;点、线、面的创建4.2&#xff0c;缓冲区计算&#xff08;Buffer Analysis&#xff09;4.3&#xff0c;点与线的相交判断4.4&#xff0c;多边…

MATLAB创建avi文件

简介 MATLAB可以对音频和视频文件进行处理&#xff0c;这里简单说明一下MATLAB创建avi文件的用法。 常用函数 aviinfo 测试用用例&#xff0c;如下所示 用于avi格式的音频视频文件&#xff0c;返回一个对该文件的描述&#xff0c;只能用于avi格式的音频视频文件。 仔细看…

网络技术十二:子网划分

子网划分 A类地址 ⑴ A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围&#xff1a;1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址&#xff1a; ①10.0.0.0到10.255.255.255是私有地址&#xff0…

mockito框架使用总结

目录 一、mock测试1.1 mock测试1.2 相关概念1.3 mock的好处 二、Mockito框架2.1 快速入门2.2 基础语法2.2.1 生成mock对象2.2.2 设置预期2.2.3 检验调用结果2.2.4 参数匹配器2.2.5 参数捕捉器2.2.6 mock静态方法调用 三、集成junit3.1 集成junit43.2 集成junit4spring3.1 集成j…

java 编程 7个简单的调优技巧

你的Java性能调优有救了&#xff01;分享7个简单实用的Java性能调优技巧 一、以编程方式连接字符串 在Java中有很多不同的连接字符串的选项。比如&#xff0c;可以使用简单的或、良好的旧StringBuffer或StringBuilder。 那么&#xff0c;应该选择哪种方法&#xff1f; 答案取…

CSS basics

CSS(Cascading Style Sheets&#xff0c;层叠样式表)是样式化web内容的代码。CSS基础将引导您开始所需的内容。我们将回答这样的问题:我如何把文本变成红色?我如何使内容显示在(网页)布局的某个位置?我如何用背景图片和颜色装饰我的网页? 1、What is CSS? 像HTML一样&…