none
vs2010中, L宏不存在了么? RRS feed

  • 问题

  • wcex.lpszClassName = L"SomeString";

    这一句 编译时会报错说:

    error C2440: '=' : cannot convert from 'const wchar_t [20]' to 'LPCSTR'

    1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    2011年4月4日 13:16

答案

  • wcex.lpszClassName = L"SomeString"; lpszClassName 是一个char*,而L""是一个const wchar*。所以报错

    用_T("SomeString")


    麻烦把正确答案设为解答。
    • 已标记为答案 Rob Pan 2011年4月12日 6:38
    2011年4月6日 5:36
    版主
  • (1)Unicode或者宽字符都没有改变char数据类型在C中的定义。
    (2)C中的宽字符基於wchar_t数据类型,它在几个头文件包括WCHAR.H中都有定义,如下:
    typedef   unsigned   short   wchar_t   ;
    因此,wchar_t数据类型与无符号短整数型相同,都是16位宽。
     
    (3)要定义包含一个宽字符的变量,可使用下面的语句:
    wchar_t   c   =   'A '   ;
    变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在记忆体中。如果检查Unicode文字的电脑储存应注意这一点。)
     
    (4)可定义指向宽字串的指针:
    wchar_t   *   p   =   L "Hello! "   ;
    注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字串按宽字符保存——即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。
     
    (5)可以用下面的语句定义宽字符数组:
    static   wchar_t   a[]   =   L "Hello! "   ;
    该字串也需要14个字节的储存空间,sizeof   (a)   将返回14。索引数组a可得到单独的字符。a[1]   的值是宽字符「e」,或者0x0065。第一个引号和L两个符号之间必须没有空格。L使编译器将字串存为每个字符2字节。
     
    (6)可在单个字符文字前面使用L字首,来表示它们应解释为宽字符。如下所示:
    wchar_t   c   =   L 'A '   ;
    但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。 
      
     
    宽字符程序库函数 
    strlen函数的宽字符版是wcslen(wide-character   string   length:宽字串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:
    size_t   __cdecl   strlen   (const   char   *)   ;
    而wcslen函数则说明如下:
    size_t   __cdecl   wcslen   (const   wchar_t   *)   ;
    要得到宽字串的长度可以调用
    wchar_t   *   pw   =   L "Hello! "   ;  
    iLength   =   wcslen   (pw)   ;
    函数将返回字串中的字符数6。改成宽字节後,字串的字符长度不改变,只是字节长度改变了。
    所有带有字串参数的C执行时期程序库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的头文件中说明。
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年4月12日 6:37
    2011年4月7日 2:27
    版主

全部回复

  • 您当前的工程设置的是多字节编码吧


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年4月5日 13:36
    版主
  • 首先,L不是宏,是C/C++标准

    所以是不可能不存在的

    然后看一下LPCSTR的定义

    typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;

    你应该知道是怎么回事了吧

    2011年4月6日 0:15
  • wcex.lpszClassName = L"SomeString"; lpszClassName 是一个char*,而L""是一个const wchar*。所以报错

    用_T("SomeString")


    麻烦把正确答案设为解答。
    • 已标记为答案 Rob Pan 2011年4月12日 6:38
    2011年4月6日 5:36
    版主
  • (1)Unicode或者宽字符都没有改变char数据类型在C中的定义。
    (2)C中的宽字符基於wchar_t数据类型,它在几个头文件包括WCHAR.H中都有定义,如下:
    typedef   unsigned   short   wchar_t   ;
    因此,wchar_t数据类型与无符号短整数型相同,都是16位宽。
     
    (3)要定义包含一个宽字符的变量,可使用下面的语句:
    wchar_t   c   =   'A '   ;
    变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在记忆体中。如果检查Unicode文字的电脑储存应注意这一点。)
     
    (4)可定义指向宽字串的指针:
    wchar_t   *   p   =   L "Hello! "   ;
    注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字串按宽字符保存——即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。
     
    (5)可以用下面的语句定义宽字符数组:
    static   wchar_t   a[]   =   L "Hello! "   ;
    该字串也需要14个字节的储存空间,sizeof   (a)   将返回14。索引数组a可得到单独的字符。a[1]   的值是宽字符「e」,或者0x0065。第一个引号和L两个符号之间必须没有空格。L使编译器将字串存为每个字符2字节。
     
    (6)可在单个字符文字前面使用L字首,来表示它们应解释为宽字符。如下所示:
    wchar_t   c   =   L 'A '   ;
    但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。 
      
     
    宽字符程序库函数 
    strlen函数的宽字符版是wcslen(wide-character   string   length:宽字串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:
    size_t   __cdecl   strlen   (const   char   *)   ;
    而wcslen函数则说明如下:
    size_t   __cdecl   wcslen   (const   wchar_t   *)   ;
    要得到宽字串的长度可以调用
    wchar_t   *   pw   =   L "Hello! "   ;  
    iLength   =   wcslen   (pw)   ;
    函数将返回字串中的字符数6。改成宽字节後,字串的字符长度不改变,只是字节长度改变了。
    所有带有字串参数的C执行时期程序库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的头文件中说明。
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年4月12日 6:37
    2011年4月7日 2:27
    版主