以前一直用L转化字符串的,
最近看书和L的定义,发现,L是只支持UNICODE,而_T和_TEXT是UNICODE和ANSI都支持的。我的程序现在是用VS2005写的UNICODE编码的程序,问题1,把L换成_T有没有实际意义?问题2,_T的宏定义是在UNICODE的情况下为L,但这个写起来比L麻烦得多,要写下划线和括号,我自己在stfdafx.h里面用宏定义把L定义成_TEXT,该怎样定义?##能用在前面吗?    #define L##str _TEXT(str)    ??

解决方案 »

  1.   

    1:无意义,除非你的程序以后要编译个ANSI的版本
      

  2.   

    1 如果只是unicode 的话,没意义
    2 这样替换不成,
      因为 定义一个 unicode 字符串 
      L 是 L"unicode"
     _T 是 _T("unicode")
     你没办法处理右括号
      

  3.   

    LZ 看看MSDNCSDN:superarhow说: 不要再使用TCHAR和_T了!他分析了原因后总结:如 果您正开始一个新的项目,请无论如何也要顶住压力,直接使用UNICODE编码!切记!您只需要对您的组员进行10分钟的培训,记住strcpy用 wcscpy,sprintf用swprintf代替,常数前加L,就可以了!它不会花您很多时间的,带给您的是稳定和安全!相信偶,没错的!!一、 在字符串前加一个L作用: 
       如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。 
      strlen("asd")   =   3;   
      strlen(L"asd")   =   6; 
      二、  _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式 
       如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。 
       如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD" 
    三、TEXT,_TEXT 和_T 一样的 
    如下面三语句:   
      TCHAR   szStr1[]   =   TEXT("str1");   
      char   szStr2[]   =   "str2";   
      WCHAR   szStr3[]   =   L("str3");   
      那么第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。   
      但二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生成UNICODE字符串。   
      为了程序的可移植性,建议都用第一种表示方法。   
      但在某些情况下,某个字符必须为ANSI或UNICODE,那就用后两种方法。 
      

  4.   

    你要确定你需要的字符串是宽字符还是窄字符_T("")是说如果你定义了UNICODE 那么就是L"",没有定义就是"";我觉得一下情况用_T()比较好,其他情况最好别用1,用THCAR,LPTSTR,LPCTSTR等tchar数据类型的时候2,用_tprintf之类的_t版本运行时函数时候3,像下面这样有w和a版本的api,调用CreateFile的时候
    #ifdef UNICODE
    #define CreateFile  CreateFileW
    #else
    #define CreateFile  CreateFileA
    #endif // !UNICODE
      

  5.   

    如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节学习了。多谢!
      

  6.   

    这些我知道,最好是写_TEXT(""),再次是_T(""),但这些写法都比L“”麻烦很多。哎。