Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

VS2008 и _TCHAR в функции _tmain()

36K
21 мая 2009 года
temporary_user
50 / / 07.05.2009
При создании в 2008й вс консольного приложения функция main() имеет следующий вид:

int _tmain(int argc, _TCHAR* argv[])

и при попытке получить параметры ком.строки (если обрабатывать как С-строки) получается абракадабра вместо введенных параметров.
// На мсдн вычитал, что тчар обусловлен "юникодностью" параметров.
И вот, собственно, вопрос: как получить/преобразовать введенные параметры и работать с ними как с обычными char-символами?
(через std::string/std::wstring вкупе с c_str() не получилось %))

Заранее спасибо.
240
21 мая 2009 года
aks
2.5K / / 14.07.2006
Исходя из вышенаписанного std::basic_string<_TCHAR> является соотвественно или std::string или std::wstring - в зависимости от настроек юникодности проекта (макросов типа UNICODE).
36K
21 мая 2009 года
temporary_user
50 / / 07.05.2009
Цитата: aks
Исходя из вышенаписанного std::basic_string<_TCHAR> является соотвественно или std::string или std::wstring - в зависимости от настроек юникодности проекта (макросов типа UNICODE).



Это тоже пробовал, вот в таком ключе:

#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> - это тип, для хранения строки и в него надо передавать параметры(и т.д. обрабатывать их)?

240
21 мая 2009 года
aks
2.5K / / 14.07.2006
Цитата: temporary_user
Это тоже пробовал, вот в таком ключе:

#ifndef UNICODE
typedef std::string String
#else
typedef std::wstring String
#endif

но почему то не заработало, и даже тип не переопределился, т.е. объявление String myString; считается ошибкой.


Значит где то в коде ошибка или это объявление не видно или синтаксическая ошибка где то.

Цитата: temporary_user

и std::basic_string<_TCHAR> - это тип, для хранения строки и в него надо передавать параметры(и т.д. обрабатывать их)?



std::basic_string - это стандартный шаблонный класс для строк. Собственно он параметризуется символьными типами char и wchar_t и в результате получаются такие тайпдефы как std::string и std::wstring.
_TCHAR - это тоже char или wchar_t в зависимости от настроек и потому параметризовав им получим эти строковые типы.

36K
21 мая 2009 года
temporary_user
50 / / 07.05.2009
Я во всем вышеописанном разобрался, но конечной цели так и не достиг.
В целях проверки делаем код(константа 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 не преобразовывается %)
Не понимаю, в чем же я ошибся...
3
22 мая 2009 года
Green
4.8K / / 20.01.2000
Не мучай себя и окружающих :)
Напиши просто
int main(int argc, char* argv[])
А в параметрах проекта укажи multibyte.

Цитата: temporary_user

То есть _TCHAR и не в char, и не в wchar_t не преобразовывается %)
Не понимаю, в чем же я ошибся...


1. _TCHAR - это не тип, а макрос и он не "преобразовывается", а "раскрывается".
2. Подумай хорошенько какой тип у argv[1], а какой у buf1[1] и buf2[1]. Только хорошенько подумай.

36K
22 мая 2009 года
temporary_user
50 / / 07.05.2009
Цитата: Green
Не мучай себя и окружающих :)


Я бы и рад, да вот не получается :(

Цитата: Green
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й раз слышу что что-то надо в настройках поменять, но что менять и где - не говорят:)? что за мультибайт и где он лежит?

3
22 мая 2009 года
Green
4.8K / / 20.01.2000
Цитата: temporary_user

argv[1] - _tchar


Неправильно!
argv[1] - THAR*

Цитата: temporary_user

насколько я понял в зависимости от значения UNICODE _tchar интерпретируется либо как wchar_t, либо как char. но на деле это не работает...


Ты правильно понял и это прекрасно работает.

Цитата: temporary_user

а вот по поводу настройки проекта можно поподробней? уже не 1й раз слышу что что-то надо в настройках поменять, но что менять и где - не говорят:)? что за мультибайт и где он лежит?


Project Property -> General Configuration -> Character Set -> Use Multi-byte Character Set

36K
22 мая 2009 года
temporary_user
50 / / 07.05.2009
ха-ха) "а ларчик просто открывался" :)

действительно argv[1] - типа tchar*,
а это значит, что (char* argv) и (char* argv[]) разные определения,
поэтому абракадабра и получалась при неправильном обращении.
а аскии/юникод тут не при чем.

Green, благодарствую. Вопрос исчерпан :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог