您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-07 21:34 288 查看
       我们在编程过程中经常遇到一些函数带有可变参数列表,例如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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: