CE printf不能用咋办啊??CE 提示建议使用StringCchVPrintfA函数??

ECrazyBoy   2009-1-19 17:20 楼主
最近移植个库,库以前是在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发现还是不行,变参的内存分布是不很清楚。。
郁闷啊。。。
大家有啥好的替代函数和方法啊。。。
谢谢。。。

回复评论 (9)

一般用RETAILMSG 函数即可。其实这个是使用串口实现的。

楼主是应用程序?RETAILMSG 是在驱动的
点赞  2009-1-19 17:29
要这个函数干啥呀,在写程序尽量用TCHAR吧
点赞  2009-1-19 18:49
CE下有对应的函数,LZ再找找
点赞  2009-1-19 19:39
printf肯定是不能用的

可以用RETAILMSG 代替,可以应用层用
点赞  2009-1-19 19:59
printf不能用的主要原因是:在CE系统中,没有console组件,即dos窗口。
点赞  2009-1-19 20:00
引用: 引用 5 楼 91program 的回复:
printf不能用的主要原因是:在CE系统中,没有console组件,即dos窗口。


___ding
点赞  2009-1-19 20:15
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
点赞  2009-1-19 21:35
直接用RETAILMSG就可以了,应用程序可以直接用
点赞  2009-1-19 22:50
OutputDebugString 也可以

printf要打印到控制台窗口,如果你的wince 没有添加控制台支持

当然用不了
点赞  2009-1-20 08:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复