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() 这三个宏存储信息的类型。用于存储可变参数信息的类型。 |
1 | void va_start(va_list ap, last_arg) 这个宏初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。 |
2 | type va_arg(va_list ap, type) 这个宏检索函数参数列表中类型为 type 的下一个参数。 |
3 | void 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)文章介绍