可变参数函数问题

金融码农 2009-12-30 01:05:17
自定义了一个可变参数函数,其中对int、char、char*、CString可以进行处理。
具体函数如下:
====================================
bool CMyLog::LogWrite(char level,char *szType,...)
{
if (OpenFile(filePath)) //if can open the log file
{
//===============================
//print the classification and time
//===============================
CString LogText;
SYSTEMTIME currTime;
GetLocalTime(&currTime);
CString myTime;
myTime.Format(L"%d-%d-%d %d:%d:%d --->", currTime.wYear, currTime.wMonth, currTime.wDay, currTime.wHour, currTime.wMinute, currTime.wSecond);
if (level == 'e')
{
LogText =L"[ERROR] " + myTime;
}
else if (level == 'i')
{
LogText =L"[INFO] " + myTime;
}

// szTypes is the argument specified; all
// others must be accessed using the variable-
// argument macros.
va_list vl;
CString tmpStr;

va_start( vl, szType);
for(int i=0; szType[i]!='\0'; i++)
{
union Printable_t {
int i;
char c;
char *s;
} Printable;
CString cs;
DWORD dwNum;

switch (szType[i])
{
case 'i':
Printable.i = va_arg(vl,int);
tmpStr.Format(L"%d",Printable.i);
LogText += tmpStr;
break;
case 'c':
Printable.c = va_arg(vl,char);
tmpStr.Format(L"%c",Printable.c);
LogText += tmpStr;
break;
case 's':
Printable.s = va_arg(vl,char*);
dwNum = MultiByteToWideChar(CP_ACP,0,Printable.s,-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,Printable.s,-1,tmpStr.GetBuffer(dwNum),dwNum);
tmpStr.ReleaseBuffer();
LogText += tmpStr;
break;
case 'w':
cs = va_arg(vl,CString);
LogText += cs;
break;
default:
break;
}
LogText.ReleaseBuffer();
}
va_end(vl);
LogText += L"\r\n";
myFile.SeekToEnd();
//to show chinese. just for debug!
//char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
//setlocale( LC_CTYPE, "chs" );//set
myFile.WriteString(LogText);
//setlocale( LC_CTYPE, old_locale );//restore
//free( old_locale );

CloseFile();
return true;
}
return false;
}
====================================
在调用时我传入int、char、char*都是正确的。但是,当传入CString时就会有问题了。代码如下:
====================================
LogWrite(L"abcd"); //有问题。说是什么内存错误。
CString logText = L"abcd";
LogWrite(logText); //这个就没有问题。
====================================
一直不知道是为什么?
求高手回答。。。
...全文
107 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2009-12-30
  • 打赏
  • 举报
回复
杯具啊,标准明确规定,不定参数函数,传入非pod类型,后果未定义。CString属非pod类型。
用重载。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧