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);
}
/*
//可变参数标准宏头文件
#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);
}
相关文章推荐
- java基础(九) 可变参数列表介绍
- 【C++基础之二十】可变参数的函数
- 【转】C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
- [C++基础]040_可变参数va_list的一段示例代码
- C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- 整理:C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- C语言可变参数函数的使用及相关函数介绍
- 编程语言基础:用“收集器”理解各种语言(C++、Java、Python)中的可变参数!
- 【C++基础之二十】可变参数的函数
- 关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
- 黑马程序员---2015.6.22java基础笔记---Collections---Arrays---方法的可变参数---常用类介绍
- C++实现可变参数列表
- [C/C++]函数参数的入栈顺序与可变参数的实现
- java基础增强 -- 可变参数例子
- 基础备忘:C++引用参数与指针参数
- java基础加强(枚举,反射,增强for循环,可变参数,自动拆箱装箱,内省)
- c++ 可变参数用法
- C++学习之可变参数的函数与模板
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子