4726|9

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CE printf不能用咋办啊??CE 提示建议使用StringCchVPrintfA函数?? [复制链接]

 最近移植个库,库以前是在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发现还是不行,变参的内存分布是不很清楚。。
郁闷啊。。。
大家有啥好的替代函数和方法啊。。。
谢谢。。。
此帖出自产业风云论坛

最新回复

OutputDebugString 也可以 printf要打印到控制台窗口,如果你的wince 没有添加控制台支持 当然用不了  详情 回复 发表于 2009-1-20 08:35
点赞 关注
 
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

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

楼主是应用程序?RETAILMSG 是在驱动的
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
要这个函数干啥呀,在写程序尽量用TCHAR吧
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
CE下有对应的函数,LZ再找找
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
printf肯定是不能用的

可以用RETAILMSG 代替,可以应用层用
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
printf不能用的主要原因是:在CE系统中,没有console组件,即dos窗口。
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 91program 的回复:
printf不能用的主要原因是:在CE系统中,没有console组件,即dos窗口。



___ding
此帖出自产业风云论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
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
此帖出自产业风云论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

9
 
直接用RETAILMSG就可以了,应用程序可以直接用
此帖出自产业风云论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
OutputDebugString 也可以

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

当然用不了
此帖出自产业风云论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表