C++可变参数在普通函数和日志函数的应用

1、普通可变参数的应用

代码参考于C 标准库 – <stdarg.h> | 菜鸟教程 (runoob.com)

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

// 计算可变参数的和
int sum(int count, ...) {
    int total = 0;
    va_list args;

    // 初始化 args 以访问可变参数
    va_start(args, count);

    // 逐个访问可变参数
    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    // 清理 args
    va_end(args);

    return total;
}

int main() {
    printf("Sum of 1, 2, 3: %d\n", sum(3, 1, 2, 3)); // 输出 6
    printf("Sum of 4, 5, 6, 7: %d\n", sum(4, 4, 5, 6, 7)); // 输出 22
    return 0;
}

关键知识介绍如下

va_list
这是一个适用于 va_start()、va_arg() 和 va_end() 这三个宏存储信息的类型。用于存储可变参数信息的类型。
1void va_start(va_list ap, last_arg)
这个宏初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数即省略号之前的参数。
2type va_arg(va_list ap, type)
这个宏检索函数参数列表中类型为 type 的下一个参数。
3void va_end(va_list ap)
这个宏允许使用了 va_start 宏的带有可变参数的函数返回。如果在从函数返回之前没有调用 va_end,则结果为未定义。

 运行结果如下:

2、日志函数的应用

以下程序使用的VS2017,只将打印输出到控制台,若要输出到文件中,可以自行修改。

程序如下:

// FunVar.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

#include <iostream>
#include <cstring>
#include <string.h>
#include <atltime.h>

using namespace::std;
//定义打印函数,方式1
#define DP0(fmt) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt));OutputDebugString(sOut);} 
#define DP1(fmt,var) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var);OutputDebugString(sOut);}
#define DP2(fmt,var1,var2) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2);OutputDebugString(sOut);} 
#define DP3(fmt,var1,var2,var3) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2,var3);OutputDebugString(sOut);}

//定义打印函数,方式2 函数参数数量可变的打印函数-输出到控制台
void WriteLogEntry(LPCTSTR pstrFormat, ...)
{
	ATLTRACE(_T("In %s ...\n"), __FUNCTIONW__);//函数名
	ATLTRACE(_T("Run to %d ...\n"), __LINE__);	//函数行数
	CTime timeWrite;
	timeWrite = CTime::GetCurrentTime();
	CString str = timeWrite.Format(_T("%d %b %y %H:%M:%S - "));
	ATLTRACE(str);

	va_list args;
	va_start(args, pstrFormat);
	str.FormatV(pstrFormat, args);
	ATLTRACE(str);
	
	return;
}

int main()
{
	OutputDebugString(_T("csfsf"));
	WriteLogEntry(_T("Start Program!\n"));
	WriteLogEntry(_T("Program has execute %d lines!\n"), 201);
	WriteLogEntry(_T("error %d occured at %d line!\n"), 1170, 400);
	WriteLogEntry(_T("Program Abouted!"));

	printf("hello!\n");
	DP0("这是调试信息!\n");
	DP1("这是调试信息%d\n", 10);
	DP2("这是调试信息%d--%d\n", 10, 10 + 1);
	DP3("这是调试信息%d--%d--%d\n", 10, 10 + 1, 10 + 2);

}

可变参数的内部实现见C/C++中可变参数函数的实现 - 廖先生 - 博客园 (cnblogs.com)文章介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值