天天看點

Error 1 error C2440: 'initializing' : cannot convert from 'wchar_t *' to 'char *'

VS2008下面将 CString轉化為char* 的問題

 使用CString的GetBuffer方法

        CString origCString("Hello,World");

        char* CharString = origCString.GetBuffer(origCString.GetLength()+1);

    網上的很多文章說的都是這個方法,但是我在VC++2008中編譯得到下列資訊

        Error 1 error C2440:   'initializing' : cannot convert from 'wchar_t *' to 'char *'  

    對于這個錯誤不是很了解,因為是剛開始使用VC不久,是以對于wchar_t和char的差別不是很清楚,在MSDN中檢視了一下,wchar_t是一個寬字元型,相當于unsigned short(16bit)。而我們通常使用的char是8bit。繼續搜尋wchar_t*到char*的轉換,msdn上面有一篇文章是Convert Between Various String Types ,講了VC++2008中的各種字元串char *, wchar_t*, _bstr_t, CComBSTR, CString, basic_string, and System.String的互相轉換。其中将wchar_t*轉換為char*的代碼如下:(為了保持文章的一緻性,修改了變量名)

        #include <stdlib.h>

        #include <iostream>

        using namespace std;

        int main()

        {

          wchar_t *origString = L"Hello,World";

          wcout << origString << endl;

          // Convert to a char*

          size_t origsize = wcslen(origString) + 1;

          const size_t newsize = 100;

          size_t convertedChars = 0;

          char CharString[newsize];

          wcstombs_s(&convertedChars, CharString, origsize, origString , _TRUNCATE);

          cout << CharString << endl;

        }   

   輸出正确,均為Hello, World!

   結合上面的兩段,看看能不能将CString轉換為char*

        CString origCString("Hello, World!");

        wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1);

        size_t origsize = wcslen(wCharString) + 1;

        size_t convertedChars = 0;

        char *CharString;

        CharString=new char(origsize);

        wcstombs_s(&convertedChars, CharString, origsize, wCharString , _TRUNCATE);

        cout << CharString << endl;

   成功輸出字元串"Hello,World"

   至于為什麼原來的那段代碼别人都能用好,而我在VC++2008下面去不能直接使用,還要通過轉換呢?正好看到《Programming Windows》的第二章講Unicode的和在msdn論壇問了一下相關問題後得到答案。

解決方法:

   原來在VC++ 2005以前,應用程式預設都是關閉對Unicode的支援的,而在VC2005後,預設打開了對它的支援,CString對應的字元串應該是TCHAR,TCHAR的定義是這樣的,

        #ifdef _UNICODE

        typedef wchar_t TCHAR    ;

        #else

        typedef char TCHAR;

        #endif

我想這個就是為什麼我在VC++2008種不能直接轉換的原因。在工程中應該可以關閉對于Unicode的支援,進而可以直接轉換。這個做法是右擊工程名 —〉Property—〉General中的character set中選擇not set,這樣,本文開頭的那段代碼就可以正确的執行了。

注:轉自 http://blog.sina.com.cn/s/blog_7e5eb91b0100ys13.html

繼續閱讀