2011-07-05 100 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