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

feliks28

#define _UNICODE
#include <windows.h>
#include <tchar.h>

main
{
TCHAR * ts = _T("0123456789");
// wchar_t * ws = L"0123456789";
}

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

Vladislav177Rus

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

0000

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

feliks28

А, ну да. Только стало еще хуже:
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++

feliks28

Не могу проверить, до вывода на экран еще, судя по всему, далеко.
без 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

0000

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

feliks28

А как я посмотрю, если я скомпилить не могу?
p.s. Почему кракозяблики-то?
из tchar.h:
#ifdef	_UNICODE
#define __TEXT(q) L##q
#else
#define __TEXT(q) q
#endif
#define _T(x) __TEXT(x)

feliks28

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

feliks28

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

Dasar

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

feliks28

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

Dasar

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

feliks28

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

feliks28

В общем фишечка:
в 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' ы выдай мне все варнинги"?
Оставить комментарий
Имя или ник:
Комментарий: