LPCTSTR和CString的关系

LPCTSTR和CString的关系 2010-12-06 08:56:33
标签:LPCTSTR CString 休闲 职场
类型理解
  LPCTSTR类型:
  L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
  P表示这是一个指针
  C表示是一个常量
  T表示在Win32环境中, 有一个_T宏
  STR表示这个变量是一个字符串
详细释义
      这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
  所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
  在程序中我们大部分时间要使用带T的类型定义。
  LPCTSTR == const TCHAR *
  CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
  常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。
  简单起见,下面只介绍 ansi 的情况,unicode 可以类推。
  ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。
  而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。
  这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。
  由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数:
  operator LPCTSTR( )
  {.
  .....
  }
  函数直接返回所维护的字符串。
  当你需要一个const char* 而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。
  当需要CString , 而传入了 const char* 时(其实 char* 也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。
  因此CString 和 LPCTSTR 基本可以通用。
  但是 LPTSTR又不同了,它是 char*, 意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。
  所以 不能随便的将 const char* 强制转换成 char* 使用。
  例如:
  LPSTR lpstr = (LPSTR)(LPCTSTR)string;
   就是这种不安全的使用方法。
  这个地方使用的是强制类型转换,你都强制转换了,C++编译器当然不会拒绝你,但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。
  强制的任意类型转换是C(++)的一项强大之处,但也是一大弊端。这一问题在 vc6 以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。
  其实在很多地方都可以看到类似 LPSTR lpstr = (LPSTR)(LPCTSTR)string; 的用法,这种情况一般是函数的约束定义不够完善的原因, 比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*, 但是很多初学者弄不清const地用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。
  这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。
  CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。
  同时需要注意的是, 在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。
  CString 转LPCTSTR:
   CString cStr;
  const char *lpctStr=(LPCTSTR)cStr;
  LPCTSTR转CString:
  LPCTSTR lpctStr;
  CString cStr=lpctStr;

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Activiti中的安全脚本如何工作

最近的Activiti 5.21.0版本的突出特点之一是“安全脚本”。 Activiti用户指南中详细介绍了启用和使用此功能的方法 。 在这篇文章中,我将向您展示我们如何实现其最终实现以及它在幕后所做的事情。 当然,由于这是我通常的签名风格,因此我们还将…

JS 代码优化

1、JS中函数单独写在一个声明函数中,执行这个使用调用函数。这样js代码结构会清爽一点。 2、js函数注释规范 /*** brief 对报文某个域组包,把逗号后面的数据组成一个字符串给ddname用* param {string} p1 参数1的说明* param {string} p2 参数2的说明&am…

c++学习之const成员变量与成员函数

c学习之const成员变量与成员函数 常类型是指用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的。因此,定义或说明常类型时必须初始化。 如果在一个类声明常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该成员…

使用准现网的数据,使用本地的样式脚本,本地调试准现网页面(PC适用)

原理: 本地逻辑,重新渲染 步骤: 1.安装插件:Tampermonkey 度盘:https://pan.baidu.com/s/1bpBVVT9 2.设置: 点击插件-->仪表盘 添加脚本 将此文本文档中的脚本复制到脚本编辑框处,并CtrlS保存…

FDATOOL设计滤波器

FDATOOL设计滤波器 分类: 数字信号处理 2006-04-20 11:251. 在Matlab中键入fdatool运行Filter Design and Analysis Tool。具体使用请参见Matlab Help中的Signal Processing Toolbox->FDATool。 2. 在fdatool工具中应该注意的几个问题:(a)Fstop&#…

大例外背后的真相

异常可能是最被滥用的Java语言功能。 这就是为什么 让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力,但我们可以帮助您。 在这篇文章中&#xff…

MATLAB里面的filter和filtfilt的C语言源代码

MATLAB里面的filter和filtfilt的C语言源代码 嗯,算法非常简单,就是网上搜不到C代码实现。filter是个很万能的数字滤波器函数,只要有滤波器的差分方程系数,IIR呀FIR呀都能通过它实现。在MATLAB里面,filter最常用的格式是…

20172302『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

一.结对对象 姓名:周亚杰学号:20172302担任角色:驾驶员(周亚杰)伙伴第二周博客地址二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程截图 a.下图是上周编写的生…

MFC标签页控件的使用

随笔- 11 文章- 0 评论- 3 MFC标签页控件的使用 1、在对话框中添加一个标签页控件,并为此控件关联一个CTabCtrl类变量m_tabctrl. 2、创建若干个对话框资源作为标签页控件的标签。 修改两个属性: Border: none // 边界为空,这样它就没…

实践中的弹性基础架构

几周前,我获得了一个难得的机会,可以在基础设施领域弄脏双手。 在JVM内部的深入了解下,我每天的工作经历发生了有趣的变化,我想与您分享动机和成果。 希望它可以启发类似的问题类别。 背景 我将从解释需要解决方案的上下文开始。…

struct和typedef struct

struct和typedef struct 分三块来讲述:   1 首先://注意在C和C里不同     在C中定义一个结构体类型要用typedef:     typedef struct Student     {     int a;     }Stu;     于是在声明变量的时候就可:Stu stu1;…

notepad++插件实现json、xml格式化

notepad比较出色的免费的数据编辑、格式化工具。。。 现在json、xml文件很流行、格式化也是必须的,方便查看关键信息! 01、下载notepad及相关插件 npp_7.5.5-x86: https://files.cnblogs.com/files/xiaochina/npp_7.5.5-x86.zip npp-json:…

ActiveMQ 5.x中的消息持久性

我被问了很多关于ActiveMQ如何存储消息(或在某些情况下不存储)的基本知识。 这是它的高级解释。 注意,上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端(即STOMP,AMQP,MQTT等),则在…

5.报错:ImportError: No module named win32api

pip install pypiwin32即可 转载于:https://www.cnblogs.com/caimuqing/p/9016190.html

bind1st bind2nd的使用

bind1st bind2nd的使用 Posted on 2010-07-16 09:14 wanpengcoder 阅读(1882) 评论(0) 编辑 收藏 bind1st和bind2nd函数用于将一个二元算子(binary functor,bf)转换成一元算子(unary functor,uf)。为了达到…

一个select元素自定义设计的新思路:appearance: none之后利用符号制造小箭头

最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分。 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终于找到了问题所在:这个灰…

调整HashMap的大小:未来的危险

最近,我偶然发现了一个错误,该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是抽象泄漏的一个很好的例子。 只有了解数据结构的实现级别详细信息,才能帮助我解决当前的问题。 因此,我希望分享我所面临的问题将…

别的程序员是怎么读你的简历的

别的程序员是怎么读你的简历的 2009年11月9日 陈皓 下面这个图片来源国外,是一个关于程序员面试时的简历,被人事部门和程序员本身评审的角度不同的图片。当然,这是一个从国外面试的视角制作的图片,不过,可以看出&#…

漫谈C++重载运算符

漫谈C重载运算符 1.前置运算符和后置运算符,左值和右值 其实很久以来一直都没有怎么搞清楚左值和右值的区别,只知道左值可以放在等号的左边,也可以放在等号的右边,但是右值却只能放在等号的右边,然后形成一个大概直观…

Zabbix linux agent 安装

系统:Linux Centos 7.3 x64 服务:Zabbix_agent 3.0.16 一.安装Zabbix_agent 服务 1.安装zabbix 3.0 yum源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 2.安装Zabbix_agent yum install zabbix-agen…