自定义日志函数--可变参数列表

原型:

int RM_LIB_SendToIC(int ulSubModuleID, int ulLevel, const char *pcMsg, ...)

实现:

#include <iostream>
#include <stdarg.h>
using namespace std;

/* 
    1、可变的参数,如果为空,那么va_list的内容就是空 “”,  但是va_list 指针不是空
	所以满足vsprintf_s的使用条件
   
	2、sprintf_s是由vsprintf_s实现的,这里封装的函数类似于sprintf_s,

	3、这里不可以把vsprintf_s换成sprintf_s,因为sprintf_s不接收 va_list参数
*/
int RM_LIB_SendToIC(int ulSubModuleID, int ulLevel, const char *pcMsg, ...)
{
	va_list pvaTmp;
	int lStrLen = 0;
	char sz[128] = { 0 };

	/* Get the formatted string */
	va_start(pvaTmp, pcMsg);    //pvaTmp内容为"
	if (pcMsg && *pcMsg) {
		lStrLen = vsprintf_s(sz, 128, pcMsg, pvaTmp);
	}
	va_end(pvaTmp);

	cout << sz << endl;

	return 1;
}

int main11()
{
	RM_LIB_SendToIC(1, 1, "hello%x=");  //这时候会访问栈越界,但不会报错。

	return 0;
}

 

小结:

可变的参数,如果为空,那么va_list的内容就是空 “”, 但是va_list 指针不是空
所以满足vsprintf_s的使用条件

posted @ 2019-03-06 15:55  ren_zhg1992  阅读(290)  评论(0)    收藏  举报