当前位置: 首页 > news >正文

C及C++不定参数log输出方法(printf风格)

一.C语言方式

1.宏定义

  #define LOG(fmt, ...) printf("[%s,%s,line=%d,%s %s] " fmt "\r\n", __FILE__, __func__, __LINE__, __DATE__,__TIME__, ##__VA_ARGS__)

  

宏名称:

LOG - 这是宏的标识符,用于在代码中调用日志功能。

参数:

fmt - 格式化字符串,类似于printf的第一个参数。

... - 可变参数列表,允许传递任意数量的额外参数。

输出格式:

[文件名,函数名,行号,日期 时间] 消息内容

2.代码示例

#include <stdio.h>

#define LOG(fmt, ...) printf("[%s,%s,line=%d,%s %s] " fmt "\r\n", __FILE__, __func__, __LINE__, __DATE__,__TIME__, ##__VA_ARGS__)

int main()

{

int value = 0;

LOG("hello");

LOG("程序启动,值为 %d\n", value);

}

输出内容:

[D:\30.VS\frm\frm.cpp,main,line=15,May 16 2025 15:56:03] hello

[D:\30.VS\frm\frm.cpp,main,line=16,May 16 2025 15:56:03] 程序启动,值为 0

二.C++方式

1.C++11引入了变参模板(template<typename... Args>),使得我们能够创建接受不定个数模板参数的模板。

template<typename T,typename ...Args>

AI写代码

T代表一个任意类型的参数,...Args代表可变参数

2.代码示例

#include <iostream>

void Printf()

{

    std::cout << std::endl;

}

template<typename T, typename ...Args>

void Printf(const T& v, Args && ...args)

{

    std::cout << v;

    if (sizeof ...(args) > 0)

    {

        Printf(std::forward<Args>(args)...);

    }

    else

    {

        Printf();

    }

}

int main()

{

    Printf("开始A");

    Printf("开始A", "开始B");

    Printf("开始", "开始", 123ABC);

}

输出内容:

开始A

开始A开始B

开始开始123

3.如果你编写代码的c++版本为C++17及以上,你可以使用下面这段代码简化操作:

template<typename... Args>

void Printf(Args&&... args) {

    (std::cout << ... << args) << std::endl;

}

三.frm库方式

1.fmtlib(简称 fmt)是一个现代化的 C++ 格式化库,提供了安全、高效且易用的字符串格式化功能。它被设计为 C++ 标准库 std::format(C++20 引入)的基础实现,并且在性能和功能上超越了传统的 printf 和 iostream。

注意:c++20以前的版本要单独安装,且性能不如C++20版本

性能对比:

2.字符串格式化示例

#include <fmt/core.h>

std::string message = fmt::format("Hello, {}! You have {} messages.", "Alice", 3);

// 输出:Hello, Alice! You have 3 messages.

http://www.xdnf.cn/news/550783.html

相关文章:

  • Python训练打卡Day29
  • Latex写作中文版
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月20日第83弹
  • C# 类的基本概念(程序和类:一个简单的示例)
  • web基础
  • 信奥赛-刷题笔记-栈篇-T3-P4387验证栈序列0520
  • Web技术与Nginx网站环境
  • 分布式序列生成方案 : Redis Incr | 基于Redisson创建自增获取序号,每天更换一个key, key到期时间1天,用于创建订单号、快递单号
  • 机器学习 day05
  • [java八股文][Java虚拟机面试篇]垃圾回收
  • ubuntu下实时检测机械硬盘和固态硬盘温度
  • 设计模式----软考中级软件设计师(自用学习笔记)
  • MD编辑器推荐【Obsidian】含下载安装和实用教程
  • AI指令模板综述(Prompt Review)
  • 车道线检测:自动驾驶的“眼睛”
  • 2025系统架构师---案例题(押题)
  • 4.安卓逆向2-抓包工具charles的安装和配置和基本使用
  • 从 0 到 1 选对 AI 自动化平台,深度对比三大AI自动化平台:n8n vs Dify vs Coze(附选型指南与实战案例)
  • 联合索引失效情况分析
  • 【神经网络与深度学习】扩散模型之通俗易懂的解释
  • 分治思想在算法(目标检测)中的体现
  • 第二章 何谓第二大脑?笔记记录
  • 1.6 提示词工程(二)
  • Gas优化利器:Merkle 树如何助力链上数据效率革命
  • 25-CAN总线
  • avalonia android连接模拟器时报错adb cannot run as root in production builds,没有权限
  • 计算机视觉与深度学习 | Matlab实现EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR时间序列预测(完整源码和数据)
  • 结合仿生学原理与计算科学进行原创性构思
  • 威纶通触摸屏IP地址设定步骤及程序下载指南
  • Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序