(LPSTR)(LPCTSTR)str到底是哪个白痴发明的?
CString str;
然后为了传入ANSI字符串
(LPSTR)(LPCTSTR)str
最先写出这种垃圾代码的白痴到底是谁?
网上到处都是,用MFC的几乎每个人都见过乃至写过!
就算是VC6,这么写结果没有问题,难道没有一个人想过LPCTSTR多一个T的意义?难道就没有一个人看过VC6安装的时候还能选UNICODE库?精简版的VC6用太多了吧!
UNICODE环境正确写法
CString str;
CStringA strA(str);
strA.GetString();或strA.GetBuffer(0);
用API?也是装B的,这是MFC啊!
字符转换这么简单的东西,难道就没一个人写对!
shit!
[解决办法]
SF!!!!!!!!
[解决办法]
你会写就写一个
[解决办法]
C++ primer上说,使用强行转换说明设计不合理,
那么,强转两次。。。
strA.GetBuffer(0);
在网上见过两种说法,一种是传入0,一种是传入字符个数
当时看到这很晕,后来还是以msdn的例子为准
[解决办法]
连续用了两个指针转换啊。看来没有人看过CString是怎么存储的。
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[解决办法]
C++语言用不好,会很可怕
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
LPCTSTR 中的T是配合微软那套国际化的方案用的,如果项目使用ANSI字符集,那么LPCTSTR 就是LPCSTR,如果是Unicode字符集,就是LPCWSTR.注意里面都有一个"C",代表 const,表示字符串的内容是不可修改的。如果要修改,必须使用GetBuffer,它返回LPTSTR,使用完之后要调用ReleaseBuffer.GetString返回的是LPCTSTR,也是不可修改的。如果要转换,就像LZ所说的,明确声明CStringA或CStringW并利用构造函数进行转换。
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
[解决办法]
(LPSTR)(LPCTSTR)str
如果在UNICODE下是不可用的
必须字符编码格式转换
[解决办法]
楼主,我强顶你.同感同感....MFC里面那些TYPEDEF烦死人....
再顶下...
[解决办法]
up up
[解决办法]
up up
[解决办法]
同感,这种东西然学习的和看代码的人平添了许多不必要的麻烦
刚开始看这些东西真有些恶心的感觉
[解决办法]
这种代码一看就头疼~!
[解决办法]
顶LZ。。不过看得不是很懂。
[解决办法]
每天接分,以示存在
[解决办法]
全用TCHAR不就完了....反正系统都用宏控制了,UNI下就是wchar,否则是char.....
实在觉得CString不好用就自己写个string类,很容易的,公司里我们就自己写,以后还能复用~
[解决办法]
淡定啊..习惯用法.国内企业大部分都求快速啊..习惯了某种用法,就一直用下去
[解决办法]
嗯,代码确实非常可恶!
------解决方案--------------------
(LPSTR)(LPCTSTR)str
我第一次见这种连续转换的,有时候就是分不清这些东西
[解决办法]
他这样做无非就是为了和原始指针接口对应,
但是CString当然不能直接转换为非const指针,所以就用了两次!
[解决办法]
确实不合理
[解决办法]
学习了
[解决办法]
代码是人写的....
[解决办法]
OMG...
[解决办法]
有些代码并不是为了效率而生的
[解决办法]
我一般这样用
- C/C++ code
str.GetBuffer(0);// do something // Note: do not operate the strstr.ReleaseBuffer();
[解决办法]
[解决办法]
不知道哪个白痴发明的。
一般可以不用 cstring 情况下,我基本不会用
[解决办法]
淡定...
[解决办法]
淡定。。。。淡定。。。。。。。
[解决办法]
事实上很多实用C++的都不会用MFC,更别说用到CSTRING
[解决办法]
恶心的代码见的多了,也就不恶心了。。。
(LPSTR)(LPCTSTR)str ,第一个转换用的是CString 的 operator LPCTSTR()的,是一个重载运算符的成员函数,所以感觉只用了一次指针强制转换。。。
写个恶心的代码,摘选自U-boot,include/exports.h
- C/C++ code
enum {#define EXPORT_FUNC(x) XF_ ## x ,#include <_exports.h>#undef EXPORT_FUNC XF_MAX};
[解决办法]
路过,。。。。。。。。。
[解决办法]
啥东东啊。
[解决办法]
我用void *
哈哈
[解决办法]
虽然恶心,但用起来觉得方便,GetBuffer()也挺恶心的。
[解决办法]
差一个T不是关键,关键是还差一个C。
差一个T如果错了,会编译不过
差一个C如果错了,可以编得过,后果很严重。
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[解决办法]
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
UNICODE:它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节
。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。
MBCS,它是多字节字符集,它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因),但表示其他文字时就需要用多字节。
WINDOWS下面的程序设计可以支持MBCS和UNICODE两种编码的字符串,具体用那种就看你定义了MBCS宏还是UNICODE宏。MBCS宏对应的字符串指针是char*也就是LPSTR,UNICODE对应的指针是unsigned short*也就是LPWSTR,为了写程序方便微软定义了类型LPTSTR,在MBCS下他就是char*, 在UNICODE下它是unsigned char*,这样你就可以重定义一个宏进行不同字符集的转换了。
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。
WindowsNT的所有与字符有关的函数都提供两种方式的版本,而Windows9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello"。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.
Windows核心编程的第一章。
L是表示字符串资源为Unicode的。
比如
wchar_t Str[] = L"Hello World!";
这个就是双子节存储字符了。
_T是一个适配的宏~
当
#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。
比如
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE编译条件下都是正确编译的。
而且MS推荐你使用相匹配的字符串函数。
比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen
否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定
[解决办法]
jf。。。这是为了区分unicode和asni的。。。是vs里面的类型的定义、、、
[解决办法]
没有办法啊,看了别人解释才明白一些.
特别是做变体类型转换,非要这样用不可,否则就会出错.
[解决办法]
反正不是我写的,熟视无睹。
[解决办法]
两种都用,想用什么就用什么,软件能工作,老板按时给我发工资就行,其它的我不管
[解决办法]
我用getbuffer(0);
[解决办法]
[解决办法]
字符转换这么简单的东西,难道就没一个人写对!
这个世界上还真没人写对过,估计将来也没人。比如你试试将“一千二百三十四”这个字符串转换成在阿拉伯文Windows下可以显示的字符串试试。
[解决办法]
[解决办法]
可怜之人必有可恨之处
[解决办法]
声明和定义函数的人,也要为调用者多考虑考虑啊.
明明一个const char* 就能满足参数的要求,却非要将参数声明为char *
你定义函数(API)是少打字了.可调用的人呢.这不是逼着人犯错误嘛.
[解决办法]
呵呵,不懂
[解决办法]
我也发现精简版的vc6都是无unicode的,那些精简的人很奇怪
[解决办法]
楼主啥时将CString详细讲解一下
[解决办法]
GOOD SHIT!
[解决办法]
淡定,淡定……
[解决办法]
这个东西是你发明的,怎样都行
[解决办法]
这么老的帖也被翻出来了,都是不结贴惹的。。。
[解决办法]
[解决办法]
看到强制转换几次有点晕。
[解决办法]
不懂,。。。
[解决办法]
其实代码本身就是个麻烦
[解决办法]
淡定淡定
jack 结贴吧,别跟垃圾代码较真
[解决办法]
世界上一开始就是Unicode就好了,所以在这点上更偏爱Java的char。
[解决办法]
其实用utf8更不错...好多代码不用改就是对的...
[解决办法]
楼主,首先,那不是强制转换,是一个重载后的操作符。。。。。。
[解决办法]
学习中,顶下!
[解决办法]
JF.............