VS2008 и _TCHAR в функции _tmain()
int _tmain(int argc, _TCHAR* argv[])
и при попытке получить параметры ком.строки (если обрабатывать как С-строки) получается абракадабра вместо введенных параметров.
// На мсдн вычитал, что тчар обусловлен "юникодностью" параметров.
И вот, собственно, вопрос: как получить/преобразовать введенные параметры и работать с ними как с обычными char-символами?
(через std::string/std::wstring вкупе с c_str() не получилось %))
Заранее спасибо.
Это тоже пробовал, вот в таком ключе:
#ifndef UNICODE
typedef std::string String
#else
typedef std::wstring String
#endif
но почему то не заработало, и даже тип не переопределился, т.е. объявление String myString; считается ошибкой.
настройки IDE чтоли поковырять надо? тогда какие:)? пробовал и на бесплатном visual c++ 2008 express и на полной visual studio 2008 - результат аналогичный
//---------------------------------------------------
или я не правильно понял? и std::basic_string<_TCHAR> - это тип, для хранения строки и в него надо передавать параметры(и т.д. обрабатывать их)?
#ifndef UNICODE
typedef std::string String
#else
typedef std::wstring String
#endif
но почему то не заработало, и даже тип не переопределился, т.е. объявление String myString; считается ошибкой.
Значит где то в коде ошибка или это объявление не видно или синтаксическая ошибка где то.
и std::basic_string<_TCHAR> - это тип, для хранения строки и в него надо передавать параметры(и т.д. обрабатывать их)?
std::basic_string - это стандартный шаблонный класс для строк. Собственно он параметризуется символьными типами char и wchar_t и в результате получаются такие тайпдефы как std::string и std::wstring.
_TCHAR - это тоже char или wchar_t в зависимости от настроек и потому параметризовав им получим эти строковые типы.
В целях проверки делаем код(константа UNICODE определена!):
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t buf1[5];
buf1[1] = argv[1];
char buf2[5];
buf2[1] = argv[1];
return 0;
}
соот-но в 1м случае получаем ошибку: невозможно преобразовать '_TCHAR *' в 'wchar_t'
а во 2м: невозможно преобразовать '_TCHAR *' в 'char'
(объявляя указатели wchar_t *buf1; char *buf2; результат такой же)
То есть _TCHAR и не в char, и не в wchar_t не преобразовывается %)
Не понимаю, в чем же я ошибся...
Напиши просто
int main(int argc, char* argv[])
А в параметрах проекта укажи multibyte.
То есть _TCHAR и не в char, и не в wchar_t не преобразовывается %)
Не понимаю, в чем же я ошибся...
1. _TCHAR - это не тип, а макрос и он не "преобразовывается", а "раскрывается".
2. Подумай хорошенько какой тип у argv[1], а какой у buf1[1] и buf2[1]. Только хорошенько подумай.
Я бы и рад, да вот не получается :(
argv[1] - _tchar
buf1[1] - wchar_t
buf2[1] - char
насколько я понял в зависимости от значения UNICODE _tchar интерпретируется либо как wchar_t, либо как char. но на деле это не работает...
касательно: int main(int argc, char* argv[])
тоже пробовал(wchar_t* argv[] в том числе), введенные параметры в ascii никак не превращаются,
а вот по поводу настройки проекта можно поподробней? уже не 1й раз слышу что что-то надо в настройках поменять, но что менять и где - не говорят:)? что за мультибайт и где он лежит?
argv[1] - _tchar
Неправильно!
argv[1] - THAR*
насколько я понял в зависимости от значения UNICODE _tchar интерпретируется либо как wchar_t, либо как char. но на деле это не работает...
Ты правильно понял и это прекрасно работает.
а вот по поводу настройки проекта можно поподробней? уже не 1й раз слышу что что-то надо в настройках поменять, но что менять и где - не говорят:)? что за мультибайт и где он лежит?
Project Property -> General Configuration -> Character Set -> Use Multi-byte Character Set
действительно argv[1] - типа tchar*,
а это значит, что (char* argv) и (char* argv[]) разные определения,
поэтому абракадабра и получалась при неправильном обращении.
а аскии/юникод тут не при чем.
Green, благодарствую. Вопрос исчерпан :)