C++基础一一可变参数的相关介绍

       我们在编程过程中经常遇到一些函数带有可变参数列表,例如printf,scanf函数等等,这些函数往往具有可变参数,那么有关可变参数的相关概念及使用方法有必要进行了解,下面我们对其进行相关介绍。

/*
//可变参数标准宏头文件  
#include "stdarg.h"  

//申明va_list数据类型变量pa,该变量访问变长参数列表中的参数。  
va_list pa;  

//宏va_start初始化变长参数列表。pa是va_list型变量,记载列表中的参数信息。  
//fmt是省略号"..."前的一个参数名,va_start根据此参数,判断参数列表的起始位置。  
va_start(ap, fmt); 

//获取变长参数列表中参数的值。pa是va_list型变量,type为参数值的类型(必须与前面的保持一致),也是宏va_arg返回数值的类型。  
//宏va_arg执行完毕后自动更改对象pa,将其指向下一个参数。  
va_arg(pa, type);  

//关闭本次对变长参数列表的访问。  
va_end(pa);  
*/

#include <iostream>
#include <cstdarg>
using namespace std;
int sum(int count, ...)
{
	if(count <= 0)
		return 0;

	va_list pa; // Declare argument list pointer
	va_start(pa, count); // Set arg_ptr to 1st optional argument

	int sum = 0;
	for(int i = 0 ; i < count ; i++)
		sum += va_arg(pa, int); // Add int value from arg_ptr and increment

	va_end(pa); // Reset the pointer to null
	return sum;
}

int main(int argc, char* argv[])
{
	cout << sum(6, 2, 4, 6, 8, 10, 12) << endl;
	cout << sum(9, 11, 22, 33, 44, 55, 66, 77, 66, 99) << endl;
	return 0;
}
另外我们在实现Log打印的过程中,需要对Log中呈现一些参数显示,也会用到可变参数,下面是一个Log打印的部分实现代码,可供参考:

DLL_EXPORT int	DLL_CALL Logger_WriteLog(HANDLE hHandle,int iType,char* pszFormat,...)
{
	EnterCriticalSection(&g_Lock);
	if (NULL == g_LogHandle.FindHandle(hHandle))
	{
		LeaveCriticalSection(&g_Lock);
		return _LOG_ERROR_FIND_HANDLE;
	}
	LeaveCriticalSection(&g_Lock);
	if (NULL == hHandle && iType != LOG_ENTER)
	{
		return _LOG_RETURN_FALSE;
	}
	char szLogContents[6048] = {0};
	if (iType!=LOG_ENTER)
	{
		va_list  args;
		va_start(args, pszFormat);
		_vsnprintf_s(szLogContents, sizeof(szLogContents), pszFormat, args);
		va_end(args);
	}

	CLogEngine* pEngine = (CLogEngine*)hHandle;
	return pEngine->Log(iType,szLogContents);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值