c ++ конвертировать из LPCTSTR в const char *
У меня эта проблема в MFC MSVC2008. Я использую unicode. У меня есть прототип функции:
MyFunction(const char *)
и я называю это:
MyfunFunction(LPCTSTR wChar).
error: Невозможно преобразовать параметр 1 Из ‘LPCTSTR’ в ‘const char *’
Как его решить?
- Почему переменные конструктора конструктора объекта C # 3.0 необязательны?
- Динамически найти class, представляющий примитивный тип Java
- Как Python 2 сравнивает строку и int? Почему списки сравниваются больше, чем числа, а кортежи - больше, чем списки?
- Как установить значение составного поля переменных с помощью динамического SQL
- В чем разница между кастингом и конверсией?
- В чем разница между (типом) значением и типом (значением)?
- Каков правильный тип индексов массивов в C?
- Преобразование std :: __ cxx11 :: string в std :: string
Поскольку вы используете MFC, вы можете легко позволить CString сделать автоматическое преобразование из char
в TCHAR
:
MyFunction(CString(wChar));
Это работает независимо от того, является ли ваша исходная строка char
или wchar_t
.
Изменить: Кажется, мой оригинальный ответ был противоположным тому, что вы просили. Легко фиксируется:
MyFunction(CStringA(wChar));
CStringA
– это версия CString
которая содержит char
символов, а не TCHAR
. Также есть CStringW
который содержит wchar_t
.
LPCTSTR
является указателем на const TCHAR
а TCHAR
– WCHAR
а WCHAR
– скорее всего wchar_t
. Сделайте свою функцию const wchar_t*
если можете, или вручную создайте буфер const char*
, скопируйте содержимое и передайте это.
Когда UNICODE определен для проекта MSVC, LPCTSTR
определяется как const wchar_t *
; простое изменение сигнатуры функции не будет работать, потому что любой код внутри функции использует входной параметр, ожидает const char *
.
Я предлагаю вам оставить подпись функции в одиночку; вместо этого вызовите функцию преобразования, такую как WideCharToMultiByte
чтобы преобразовать строку перед вызовом вашей функции. Если ваша функция вызывается несколько раз, и слишком сложно добавить преобразование перед каждым вызовом, создайте перегрузку MyFunction(const wchar_t *wChar)
. Затем он может выполнить преобразование и вызвать исходную версию с результатом.
Это может быть не совсем по теме, но я написал несколько общих вспомогательных функций для моей предлагаемой wmain-структуры , поэтому, возможно, они полезны для кого-то.
Обязательно вызывайте std::setlocale(LC_CTYPE, "");
в вашем main()
прежде чем делать какие-нибудь жесткие вещи!
#include #include #include #include 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 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 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.
Если вам интересно, вот остальная часть frameworks:
#include std::vector parse_args_from_char_to_wchar(int argc, char const * const argv[]) { assert(argc > 0); std::vector 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
:
#ifdef WIN32 #include extern "C" int main() { std::setlocale(LC_CTYPE, ""); int argc; wchar_t * const * const argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); return wmain(std::vector(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::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