3803|7

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CString str("123"); 一直搞不明白,这样也可以? [复制链接]

Wince + eVC4 中:

CString str("123");

编译通过,运行没问题;调试一看,的确是 UNICODE 字符,这是为什么?

我并没有在字符串前边加 L 或 _T() ,怎么也行?

最新回复

学习咯 ^_^  详情 回复 发表于 2007-12-2 09:27
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个问题,和CString类的定义有关,查一下就清楚了。
CString类中存放字符串是的一个TCHAT数组,TCHAR的定义如下:
#ifdef UNICODE
typedef WCHAR               TCHAR;
#else
typedef char                TCHAR;
#endif

所以在CE中,CString类中的字符串是Unicode,不是char
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
哦,原来是这样。

那 SetDlgItemText(IDC_EDIT,"123");

又为什么会编译不通过呢?

改为如下就对了:

SetDlgItemText(IDC_EDIT,L"123");
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
lz可以看看
CString   的类实现。
他的构造函数中是有
CString (char * )的,在构造函数中自动给你转为unicode了。所以你可以这样使用。

但是SetDlgItemText不一样,他在ce下没有char版本的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
lenux说的对!

看了下 CString 源代码,看到底下一段:


  1. #ifdef _UNICODE
  2. CString::CString(LPCSTR lpsz)
  3. {
  4.         Init();
  5.         int nSrcLen = lpsz != NULL ? lstrlenA(lpsz) : 0;
  6.         if (nSrcLen != 0)
  7.         {
  8.                 AllocBuffer(nSrcLen);
  9.                 _mbstowcsz(m_pchData, lpsz, nSrcLen+1);
  10.                 ReleaseBuffer();
  11.         }
  12. }
  13. #else //_UNICODE
  14. CString::CString(LPCWSTR lpsz)
  15. {
  16.         Init();
  17.         int nSrcLen = lpsz != NULL ? wcslen(lpsz) : 0;
  18.         if (nSrcLen != 0)
  19.         {
  20.                 AllocBuffer(nSrcLen*2);
  21.                 _wcstombsz(m_pchData, lpsz, (nSrcLen*2)+1);
  22.                 ReleaseBuffer();
  23.         }
  24. }
  25. #endif //!_UNICODE
复制代码


如果定义了_UNICODE标识,它会把LPCSTR转换为UNICODE字符串。


不过,我却找不到 CString str = L"123"; 的定义;

就是说如果直接输入的就是UNICODE字符串,它是如何处理的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
CString   str   =   L"123";
使用的是拷贝构造函数
CString   str(L"123");
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
找到了,如下:


  1. //////////////////////////////////////////////////////////////////////////////
  2. // More sophisticated construction

  3. CString::CString(LPCTSTR lpsz)
  4. {
  5.         Init();
  6.         if (lpsz != NULL && HIWORD(lpsz) == NULL)
  7.         {
  8.                 UINT nID = LOWORD((DWORD)lpsz);
  9.                 if (!LoadString(nID))
  10.                         TRACE1("Warning: implicit LoadString(%u) failed\n", nID);
  11.         }
  12.         else
  13.         {
  14.                 int nLen = SafeStrlen(lpsz);
  15.                 if (nLen != 0)
  16.                 {
  17.                         AllocBuffer(nLen);
  18.                         WCE_FCTN(memcpy)(m_pchData, lpsz, nLen*sizeof(TCHAR));
  19.                 }
  20.         }
  21. }
复制代码


帖子放2天,让更多的朋友看看,星期天结贴,谢谢大家!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习咯 ^_^
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表