CString str;
str.Format(L"%s", CM2W(ss.data()));
str.Format(L"%s, %s", (LPCTSTR)CM2W(ss.data()), (LPCTSTR)CM2W("asdfg"));
str.Format(L"%s", (LPCTSTR)CA2W("trew")); //正确
str.Format(L"%s, %s", CA2W("trew"), CA2W("12345")); //错误
str.Format(L"%s, %s", (LPCTSTR)CA2W("trew"), (LPCTSTR)CA2W("12345")); //正确
str.Format(L"%s, %s", CA2W("trew").m_psz, CA2W("12345").m_psz); //正确
str.Format(L"%s, %s", CString(L"trew"), CString(L"12345")); //正确
str.Format(L"%s, %s", CDuiString(L"trew"), CDuiString(L"12345")); //正确
CDuiString sd1 = L"dafsdf", sd2 = L"8955";
str.Format(L"%s, %s", sd1, sd2); //错误
stringstream sst;
sst << CW2A(L"zxcv") << 88 << CW2A(L"bnm"); //正确
在格式化字符串时,如果用到了CA2W,发现当格式化多个时需要加强制类型转换,否则格式化出来的是乱码,开始以为是后面的CA2W对象提前析构的问题,后来进入格式函数内部测试,发现是由于内部变量的地址计算错误导致的,主要原因就是该类的成员中多了一个 char m_szBuffer[t_nBufferLength];,这个在可变参数格式化时,排在后面的就会地址计算错误。
测试函数:
int CDuiString::Format(LPCTSTR pstrFormat, ...)
{
int nRet;
va_list Args;
va_start(Args, pstrFormat);
TCHAR *p1 = va_arg(Args, TCHAR*);
nRet = InnerFormat(pstrFormat, Args);
va_end(Args);
return nRet;
}
INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
VA_END宏,清空va_list可变参数列表:
#define va_end(ap) ( ap = (va_list)0 )