我在MSVC2008 MFC中遇到此问题。我正在使用unicode。我有一个函数原型:
MyFunction(const char *)
我正在呼唤它:
MyfunFunction(LPCTSTR wChar).
错误:无法将参数1从“LPCTSTR”转换为“const char *”
如何解决?
答案 0 :(得分:5)
由于您使用的是MFC,因此您可以轻松让CString自动从char
转换为TCHAR
:
MyFunction(CString(wChar));
无论您的原始字符串是基于char
还是wchar_t
,这都有效。
编辑:我的原始答案似乎与您的要求相反。轻松修复:
MyFunction(CStringA(wChar));
CStringA
是CString
的一个版本,专门包含char
个字符,而不是TCHAR
。还有一个CStringW
,其中包含wchar_t
。
答案 1 :(得分:2)
LPCTSTR
是const TCHAR
的指针,TCHAR
是WCHAR
,WCHAR
最有可能是wchar_t
。如果可以,请使用const wchar_t*
,或手动创建const char*
缓冲区,复制内容并传递。{/ p>
答案 2 :(得分:2)
为MSVC项目定义UNICODE时,LPCTSTR
定义为const wchar_t *
;简单地更改函数签名将不起作用,因为函数中的任何代码使用输入参数都需要const char *
。
我建议你单独留下功能签名;而是在调用函数之前调用转换函数(如WideCharToMultiByte
)来转换字符串。如果多次调用函数并且在每次调用之前添加转换太繁琐,请创建一个重载MyFunction(const wchar_t *wChar)
。然后,可以执行转换并使用结果调用原始版本。
答案 3 :(得分:1)
这可能不完全是主题,但是我为我提议的wmain framework编写了几个通用辅助函数,所以它们对某人有用。
请务必在std::setlocale(LC_CTYPE, "");
之前致电main()
,然后再做任何粗俗的事情!
#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
字符串。
如果你很好奇,这是框架的其余部分:
#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
答案 4 :(得分:0)
在此示例中,我将LPCTSTR转换为const char指针和char指针。对于此转换,您需要包括windows.h和atlstr.h,希望对您有所帮助。
// Inclusions required
#include <windows.h>
#include <atlstr.h>
// Code
LPCTSTR fileName = L"test.txt";
CStringA stringA(fileName);
const char* constCharP = stringA;
char* charP = const_cast<char*>(constCharP);