LINUX.ORG.RU

gcc под виндой.


0

1

Пишу тут dll-библиотечку на gcc под винду. Насколько я знаю, литерал вида L"Превед" имеет тип wchar_t*. Только вот такой литерал нельзя передать в WinAPI - функцию семейства *W (CreateFileW итд), т.к то что GCC считает wchar_t не имеет никакого отношения к виндовому WCHAR. Посему вопрос - а можно ли вообще в gcc нормально пользоваться виндовым уникодом?

★★★

Есть подозрения, что тему потрут как оффтоп, ибо недальновидным плевать, что здесь замешан GNU.

Chaser_Andrey ★★★★★
()

Подозреваю, что у gcc под вендой тип wchar_t имеет такую же длину как и в линуксе - 4 байта. А в перде WCHAR - 2 байта. Конвертируется UTF-32 в UTF-16 достаточно просто, в простейшем случае можно вообще просто отбросить «лишние» два байта =).

Кстати, какую именно сборку gcc под венду используешь?

Deleted
()

[quote] A 16-bit Unicode character. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef wchar_t WCHAR; [/quote] Может размеры не совпадают

cipher ★★★★★
()

QString не вариант?

anonymous
()
Ответ на: комментарий от aho

>какой размер wchar_t в байтах у mingw?

Да четыре. У WCHAR - два. Мне интересен способ создания WCHAR- литералов в gcc. Сейчас они у меня в однобайтной кодировке, при инициализации программы и их конвертирую в виндовые строки при помощи ::MultiByteToWideChar. Интересно есть ли менее банальный подход.

Absurd ★★★
() автор топика

В какой кодировке идет сам литерал в исходнике?

xydo ★★
()

Если gcc свежий, то он поддерживает C++-0x. В C++-0x есть UTF-16-литералы.

1.cpp:

#include <stdio.h>

int main (int argc, char * argv[])
{
  printf("sizeof(1) = %d\nsizeof(2) = %d\n", (int)sizeof(u"q"), (int)sizeof(U"q"));
  return 0;
}

$ g++ -o 1 1.cpp -std=c++0x
$ ./1
sizeof(1) = 4
sizeof(2) = 8
dmitry_vk ★★★
()
Ответ на: комментарий от Absurd

>Интересно есть ли менее банальный подход.
конвертнуть исходник в юникод.

xydo ★★
()
Ответ на: комментарий от Absurd

>> какой размер wchar_t в байтах у mingw?

Да четыре.


У тебя не правильный mingw.

LamerOk ★★★★★
()

На винде wchar_t всегда 2 байта, в том числе и в GCC под MinGW.

Сишное ABI - у ОС, а не у компиляторов. Если ABI компилятора не соответствует таковому в ОС - его надо выкидывать.

anonymous
()
Ответ на: комментарий от anonymous

>Сишное ABI - у ОС, а не у компиляторов. Если ABI компилятора не соответствует таковому в ОС - его надо выкидывать

а вот и нет

ABI таки у компилятора, дело в том, что виндовые либы (system32, ntdll) собраны компилятором, у которого wchar_t - 2байтовый, и чтобы вызывать функции из них, нужно использовать тот же ABI.

Чисто теоретически можно пересобрать все виндовые либы при помощи GCC с 4байтовым wchar_t, а строки для ядерных вызовов передавать через char*, предварительно сконвертировав в UTF-16 :)


anonymous
()
Ответ на: комментарий от anonymous

Чисто даже теоретически - нельзя. Подумай на досуге, зачем там wchar_t 2, а не 4 байта.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.