c ++ конвертировать из LPCTSTR в const char *

У меня эта проблема в MFC MSVC2008. Я использую unicode. У меня есть прототип функции:

MyFunction(const char *) 

и я называю это:

 MyfunFunction(LPCTSTR wChar). 

error: Невозможно преобразовать параметр 1 Из ‘LPCTSTR’ в ‘const char *’

Как его решить?

Поскольку вы используете MFC, вы можете легко позволить CString сделать автоматическое преобразование из char в TCHAR :

 MyFunction(CString(wChar)); 

Это работает независимо от того, является ли ваша исходная строка char или wchar_t .

Изменить: Кажется, мой оригинальный ответ был противоположным тому, что вы просили. Легко фиксируется:

 MyFunction(CStringA(wChar)); 

CStringA – это версия CString которая содержит char символов, а не TCHAR . Также есть CStringW который содержит wchar_t .

LPCTSTR является указателем на const TCHAR а TCHARWCHAR а 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 args) :

 #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 
  • Все ли указатели данных одинакового размера на одной платформе для всех типов данных?
  • Создание экземпляра Generic с переменной, содержащей тип
  • В чем разница между «1L» и «1»?
  • Что представляет собой тип, за которым следует _t (underscore-t)?
  • long / bigint / десятичный эквивалентный тип данных в R
  • Настроить десятичную точку вместо запятой в вводе номера HTML5 (на стороне клиента)
  • Interesting Posts
    Давайте будем гением компьютера.