2011-07-05 101 views
4

我在MSVC2008 MFC中遇到了這個問題。我使用的是unicode。我有一個函數原型:C++從LPCTSTR轉換爲const char *

MyFunction(const char *) 

,我稱之爲:

MyfunFunction(LPCTSTR wChar). 

error:Cannot Convert Parameter 1 From 'LPCTSTR' to 'const char *'

如何解決呢?

+0

什麼功能是你打電話?你自己寫了嗎?它應該能夠處理Unicode字符串嗎? –

回答

2

LPCTSTR是一個指向const TCHARTCHARWCHARWCHAR是最有可能wchar_t。如果可以,請使用const wchar_t*或手動創建const char*緩衝區,複製內容並通過該功能。

+2

更好的是,使用本地感知的'wcstombs'提供一個從'const wchar_t *'到const char *'(或'std :: wstring'到'std :: string')的通用轉換函數,那。 –

+0

wcstombs用於:將const wchar_t *轉換爲char *。我必須從LPCTSTR(const wchar_t *)轉換爲const char *。 – Annie

+0

@Annie:'wcstombs'可以正常工作。任何接受'const char *'的函數也會接受'char *',它只會將後者當作'const'來處理。 – Praetorian

2

當爲MSVC項目定義UNICODE時LPCTSTR被定義爲const wchar_t *;只是更改函數簽名將不起作用,因爲函數內的任何代碼都使用輸入參數期望const char *

我建議你單獨留下函數簽名;而是在調用函數之前調用諸如WideCharToMultiByte之類的轉換函數來轉換字符串。如果您的功能被多次調用,並且在每次調用之前添加轉換過於繁瑣,請創建一個過載MyFunction(const wchar_t *wChar)。然後,這個人可以執行轉換並將結果調用爲原始版本。

5

由於您使用MFC,你可以很容易地讓CString的做自動轉換從charTCHAR

MyFunction(CString(wChar)); 

這工作你原來的字符串是char或基於wchar_t

編輯:看來我的原始答案與你所要求的相反。容易地固定:

MyFunction(CStringA(wChar)); 

CStringA是一個版本的CString特異性包含char字符,不TCHAR。還有一個CStringW其中包含wchar_t

1

這可能不完全是主題,但我爲我提出的wmain framework寫了幾個通用幫助函數,所以也許它們對某人有用。

請確保在你的main()打電話std::setlocale(LC_CTYPE, "");之前做任何粘性的東西!

#include <string> 
#include <vector> 
#include <clocale> 
#include <cassert> 

std::string get_locale_string(const std::wstring & s) 
{ 
    const wchar_t * cs = s.c_str(); 
    const size_t wn = wcsrtombs(NULL, &cs, 0, NULL); 

    if (wn == size_t(-1)) 
    { 
    std::cout << "Error in wcsrtombs(): " << errno << std::endl; 
    return ""; 
    } 

    std::vector<char> buf(wn + 1); 
    const size_t wn_again = wcsrtombs(&buf[0], &cs, wn + 1, NULL); 

    if (wn_again == size_t(-1)) 
    { 
    std::cout << "Error in wcsrtombs(): " << errno << std::endl; 
    return ""; 
    } 

    assert(cs == NULL); // successful conversion 

    return std::string(&buf[0], wn); 
} 

std::wstring get_wstring(const std::string & s) 
{ 
    const char * cs = s.c_str(); 
    const size_t wn = mbsrtowcs(NULL, &cs, 0, NULL); 

    if (wn == size_t(-1)) 
    { 
    std::cout << "Error in mbsrtowcs(): " << errno << std::endl; 
    return L""; 
    } 

    std::vector<wchar_t> buf(wn + 1); 
    const size_t wn_again = mbsrtowcs(&buf[0], &cs, wn + 1, NULL); 

    if (wn_again == size_t(-1)) 
    { 
    std::cout << "Error in mbsrtowcs(): " << errno << std::endl; 
    return L""; 
    } 

    assert(cs == NULL); // successful conversion 

    return std::wstring(&buf[0], wn); 
} 

你可以提供 「虛擬」 重載:

inline std::string get_locale_string(const std::string & s) { return s; } 
inline std::wstring get_wstring(const std::wstring & s) { return s; } 

現在,如果你有一個LPCTSTR x,您可以隨時撥打get_locale_string(x).c_str()獲得char -string。


如果你很好奇,這裏的框架的其他部分:

#include <vector> 

std::vector<std::wstring> parse_args_from_char_to_wchar(int argc, char const * const argv[]) 
{ 
    assert(argc > 0); 

    std::vector<std::wstring> args; 
    args.reserve(argc); 

    for (int i = 0; i < argc; ++i) 
    { 
    const std::wstring arg = get_wstring(argv[i]); 
    if (!arg.empty()) args.push_back(std::move(arg)); 
    } 

    return args; 
} 

現在main() - 新的切入點是始終int wmain(const std::vector<std::wstring> args)

#ifdef WIN32 

#include <windows.h> 

extern "C" int main() 
{ 
    std::setlocale(LC_CTYPE, ""); 

    int argc; 
    wchar_t * const * const argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); 

    return wmain(std::vector<std::wstring>(argv, argv + argc)); 
} 

#else // WIN32 

extern "C" int main(int argc, char *argv[]) 
{ 
    LOCALE = std::setlocale(LC_CTYPE, ""); 

    if (LOCALE == NULL) 
    { 
    LOCALE = std::setlocale(LC_CTYPE, "en_US.utf8"); 
    } 

    if (LOCALE == NULL) 
    { 
    std::cout << "Failed to set any reasonable locale; not parsing command line arguments." << std::endl; 
    return wmain(std::vector<std::wstring>()); 
    } 

    std::cout << "Locale set to " << LOCALE << ". Your character type has " 
      << 8 * sizeof(std::wstring::value_type) << " bits." << std::endl; 

    return wmain(parse_args_from_char_to_wchar(argc, argv)); 
} 

#endif