Tchar c что это
Перейти к содержимому

Tchar c что это

  • автор:

LPSTR, LPWSTR, TCHAR, char*, .

TCHAR — это изобретение Microsoft и куча проблем с ним связано. Если у вас проект на Unicode, то это TCHAR = wchar_t. Если ASCII то TCHAR = char.

#ifdef _UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif http://www.pvsm.ru/unicode/23896 

Поскольку TCHAR в исходниках примеров драйверов повсюду надо понимать как с ним далее работать. Как следствие надо использовать Windows Safe String Function для разных преобразований:

присвоить значение TCHAR строке :

TCHAR str[100]; StringCchCopy(str, ARRAYSIZE(str), L"127.0.0.1"); /* STRSAFEAPI StringCchCopyA( STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc ); */ 

Если надо int в TCHAR преобразовать (int -> TCHAR):

TCHAR str[100]; StringCchPrintf(str, ARRAYSIZE(str), TEXT("%d"), (int)number); 

присваивание значений строкам

"строка ANSI"; // ANSI L"строка Unicode"; // Unicode TEXT("строка ANSI|Unucode по ситуации как и с TCHAR") _T = TEXT 

LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.

LPSTR общеприменяемый префикс с названии sz

typedef char* LPSTR; 

LPCWSTR,LPWSTR описан так:

typedef const WCHAR* LPCWSTR; typedef WCHAR* LPCWSTR; 

LPCTSTR
LP — Long Pointer (Длинный указатель)
C — Constant (Константа)
T = TCHAR
STR = String (Строка)

Что такое STRSAFE? Смотрим strsafe.h :

typedef __nullterminated char* STRSAFE_LPSTR; typedef __nullterminated const char* STRSAFE_LPCSTR; typedef __nullterminated wchar_t* STRSAFE_LPWSTR; typedef __nullterminated const wchar_t* STRSAFE_LPCWSTR; typedef __nullterminated const wchar_t UNALIGNED* STRSAFE_LPCUWSTR; 

Там же в strsafe.h :

#ifdef UNICODE #define StringCchCopy StringCchCopyW #else #define StringCchCopy StringCchCopyA #endif // !UNICODE #ifdef UNICODE #define StringCchPrintf StringCchPrintfW #else #define StringCchPrintf StringCchPrintfA #endif // !UNICODE 

Скопировать TCHAR* в char* (универсальный вариант)

TCHAR ourIpAdress[100]; char *ipAddres = new char[256]; int cbMultiByte = WideCharToMultiByte(CP_ACP,0,ourIpAdress,sizeof(ourIpAdress),ipAddres,sizeof(ipAddres),NULL,NULL); 

wcstombs(ipAddres, ourIpAdress, sizeof(ourIpAdress)); к сожалению только если UniCode исползуется

[си] TCHAR = _T() при #define _UNICODE

При компиляции ругается warning’ом: initialization from incompatible pointer type
на строку TCHAR * ts = _T(«0123456789»);
Это почему так ругается?
p.s. закомментированная строка, на которую, как я понимаю, все и подменяется, компилируется нормально.

#define _UNICODE ?
Ммм, проверил твой код, у меня не ругается (vc++ 2005)

А если не циферки, а буковки так конвертить, то они правильно выведутся на экран?
P.S. tchar.h вроде не надо подключать — он windows.h и так есть. И TCHAR = wchar_t при включенном UNICODE.

А, ну да. Только стало еще хуже:

In file included from test.c:2: 
../../../lib/gcc/mingw32/3.4.2/../../../../include/tchar.h:41: error: syntax error before "TCHAR"
../../../lib/gcc/mingw32/3.4.2/../../../../include/tchar.h:42: error: syntax error before "_TCHAR"
In file included from ../../../lib/gcc/mingw32/3.4.2/../../../../include/windef.h:246,
from ../../../lib/gcc/mingw32/3.4.2/../../../../include/windows.h:48,
from test.c:3:
../../../lib/gcc/mingw32/3.4.2/../../../../include/winnt.h:96: error: syntax error before "TBYTE"
../../../lib/gcc/mingw32/3.4.2/../../../../include/winnt.h:97: error: syntax error before '*' token
../../../lib/gcc/mingw32/3.4.2/../../../../include/winnt.h:98: error: syntax error before '*' token
In file included from ../../../lib/gcc/mingw32/3.4.2/../../../../include/windows.h:50,
from test.c:3:
../../../lib/gcc/mingw32/3.4.2/../../../../include/winbase.h:1026: error: syntax error before "LPCTSTR"
../../../lib/gcc/mingw32/3.4.2/../../../../include/winbase.h:1027: error: syntax error before "LPCTSTR"
../../../lib/gcc/mingw32/3.4.2/../../../../include/winbase.h:1028: error: syntax error before "LPTSTR"
In file included from ../../../lib/gcc/mingw32/3.4.2/../../../../include/windows.h:76,
from test.c:3:
../../../lib/gcc/mingw32/3.4.2/../../../../include/ddeml.h:194: error: syntax error before "TCHAR"
test.c: In function `_tmain':
test.c:7: error: `ts' undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)

Сижу под виндой на компиляторе(gcc) от последнего dev-c++

Не могу проверить, до вывода на экран еще, судя по всему, далеко.
без tchar.h ругается на _T:

test.c: In function `_tmain': 
test.c:7: warning: initialization makes pointer from integer without a cast
C:\DOCUME~1\\LOCALS~1\Temp/ccGGaaaa.o(.text+0xe):test.c: undefined reference to `_T'
../../../lib/gcc/mingw32/3.4.2/../../../libmingw32.a(main.o.text+0x106):main.c: undefined reference to `16'
collect2: ld returned 1 exit status

Хм, у меня просто VS 2005
А что нельзя что ли через cout или printf какой нить посмотреть вывод? Че то мне кажется что если ты через _T преобразуешь, то там коряблики будут.
P.S. Имел дело только с С++ и то немного.

А как я посмотрю, если я скомпилить не могу?
p.s. Почему кракозяблики-то?
из tchar.h:

#ifdef _UNICODE 
#define __TEXT(q) L##q
#else
#define __TEXT(q) q
#endif
#define _T(x) __TEXT(x)

Ступил (впрочем мне простительно):
_tmain — > main, т.к. MinGW’шный компилятор не содержит wmain
меняем местами tchar.h и windows.h, т.к. tchar.h не описывает wchar_t, а только использует.

Закрыть я погорячился.
Это только исправляет, чтобы не ругалось error’ами, но делает актуальным (код я подправил)
Warning тот же: initialization from incompatible pointer type
Что ему не нравится и почему прекрасно компилится wchar_t * ts = L»0123456789″; ? Это не то же самое разве?

посмотреть код после макропроцессинга твой компилятор позволяет?

Ну, в выходном файле препроцессора макросы типа #ifdef обработались, а TCHAR’ы остались.
p.s. MinGW’шный core c

TCHAR — это наверное typedef
через rtti можно попробовать вывести тип TCHAR-а

через rtti можно попробовать вывести тип TCHAR-а

Я не умею. А в чистом c оно есть? у препроцессора флаг -frtti только для c++

В общем фишечка:
в MinGW в winnt.h (где определяется TCHAR и __TEXT) используется #ifdef UNICODE
А в tchar.h (где тоже определяется TCHAR __TEXT и еще куча оберток) используется #ifdef _UNICODE
Таким образом сначала в одном файле определяется TCHAR и определяется _TCHAR_DEFINED, а так же определяется __TEXT(q)
А во втором файле, TCHAR остается, а т.к. для него UNICODE’ная переменная другая, __TEXT(q) переопределяется.
Т.е. похоже надо одновременно определять и UNICODE и _UNICODE
Оно ж не повредит?
p.s. Как сказать компилятору «Забей на ‘#pragma GCC system_header’ ы выдай мне все варнинги»?

TCHAR и с чем его едят

Добрый вечер. Уважаемые знатоки, не подскажете ли вы, как можно преобразовать строку из TCHAR и обратно?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

__declspec(property) и с чем его едят
Что это такое и как это использовать? У меня задание в лабораторной по обычному с++, но вот такая.

что такое Qt, и с чем его едят?
Здравствуйте, я бы хотел узнать что такое Qt, и как на нем программировать, я слышал что это.

Что такое This и с чем его едят
Доброго дня/ночи Вот пытаюсь выкурить мануалы по теме "this". Прочитал надцать листов литературы.

Что такое istream и с чем его едят?
здравствуйте. у меня такой вопрос , делаем лабы с перечислениями и структурами и в них появилось.

Tchar c что это

Рейтинг (т): 527

tchar не связан непосредственно с переносимостью между исполнительными платформами. Его задача – обеспечить переносимость между ANSI и UNICODE. Самый простой вариант в этом аспекте – просто не использовать юникод как базу. Тем более, что реализаций юникода существует более одной.
Переносимость между исполнительными платформами достигается избавлением от использования любых предположений об их характеристиках. В частности от API операционной системы. Кросс-платформенное ПО использует исключительно стандартные библиотеки, являющиеся частью языка и описываемые Стандартом языка, а также библиотеки третьих сторон, которые тоже кросс-платформенны.

Сообщ. #5 , 16.04.15, 19:05

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *