最近移植个库,库以前是在PC上编译的,都是用多字节的printf,在CE下报错,
情况如下:
error C2065: 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' : undeclared identifier
然后我就按它的提示使用StringCchPrintfA;
定义了个宏:
#ifdef sprintf
#undef sprintf
#define sprintf(dst,format, othr) ce_sprintf(dst,format, othr)
#endif
函数定义如下:
int ce_sprintf (char *buf, const char *format, ...)
{
va_list argList;
va_start(argList, format);
StringCchPrintfA(buf, STRSAFE_MAX_CCH, format, argList);
va_end(argList);
}
但发现程序还是出错,到网上查了下变参的使用有问题;
后来我又改了下:
int ce_sprintf (char *buf, const char *format, ...)
{
va_list argList;
char c;
char szTemp[256];
char *p = (char *)va_start(argList, format);
do
{
c =*format;
if (c != '%')
{
//ce_sprintf(buf, "%c", c);
buf++;
format++;
}
else
{//按格式字符输出数据
switch(*++format)
{
case 'd':
case 'D':
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%d", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
case 'X':
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%x", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
case 'x':
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%x", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
case 'f':
case 'F':
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%f", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
case 'c':
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%c", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
case 'C':
{
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%C", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
p = (char *)va_arg(argList, int);
format++;
}
break;
case 's':
case 'S':
if (*(char **)argList == NULL)
{
return -1;
}
StringCchVPrintfA(szTemp, STRSAFE_MAX_CCH, "%s", argList);
strcat(buf, szTemp);
buf += strlen(szTemp);
va_arg(argList, int);
format++;
break;
default:
// ASSERT(FALSE);
break;
}
}
} while (*format != '\0');
va_end(argList);
return 0;
}
程序大致模仿printf发现还是不行,变参的内存分布是不很清楚。。
郁闷啊。。。
大家有啥好的替代函数和方法啊。。。
谢谢。。。
一般用RETAILMSG 函数即可。其实这个是使用串口实现的。
楼主是应用程序?RETAILMSG 是在驱动的
printf肯定是不能用的
可以用RETAILMSG 代替,可以应用层用
printf不能用的主要原因是:在CE系统中,没有console组件,即dos窗口。
ce下可以用printf的。printf是往标准输出设备(stdout)输出,可以是command shell也可以是telnet console,甚至你也可以自己把它重定向到串口。
你这个错误是因为微软在最新的C++编译器中引入了safe string function替换c标准string function引起的,因为这些老的函数容易导致buffer overflow攻击,微软希望以后大家用safe string function替换这些函数。
如果你还是想用老的函数还是可以的,在include 之前定义这个宏:
#define STRSAFE_NO_DEPRECATE
include
或者更简单的做法,VC的话在你的编译选项里定义它,PB的话在sources文件里加上
CDEFINES=$(CDEFINES) -DSTRSAFE_NO_DEPRECATE
直接用RETAILMSG就可以了,应用程序可以直接用
OutputDebugString 也可以
printf要打印到控制台窗口,如果你的wince 没有添加控制台支持
当然用不了