Объясните наконец глупому человеку, в каком случае нужны конструкции типа
#ifdef UNICODE
... используем одни типы переменных и функции, для юникода...
#else
... используем соответственно другие...
Т.е. в каких случаях в системе определен Unicode, а в каких нет.
Кроме того, при программировании под XP можно ли считать, что он в любом случае определен?
Здравствуйте, Desert_Sun, Вы писали:
D_S> Уважаемые господа!
D_S>Объясните наконец глупому человеку, в каком случае нужны конструкции типа
D_S>#ifdef UNICODE D_S>... используем одни типы переменных и функции, для юникода... D_S>#else D_S>... используем соответственно другие...
D_S>Т.е. в каких случаях в системе определен Unicode, а в каких нет.
Не в системе, а в программе. D_S>Кроме того, при программировании под XP можно ли считать, что он в любом случае определен?
D_S>Заранее огромное спасибо.
По большому счету в программе использование этих конструкций не требуется, так как все уже сделано за нас.
Т.е. пример функция MessageBox , в зависимости от определен UNICODE или нет вызывается MessageBoxA или MessageBoxW.
Поэтому следует использовать тип TCHAR вместо явного типа char, это позваолит избежать проблемы при перекомпиляции программы на UNICODE или наоборот, без него.
Здравствуйте, Desert_Sun, Вы писали:
D_S> Уважаемые господа!
D_S>Объясните наконец глупому человеку, в каком случае нужны конструкции типа
D_S>#ifdef UNICODE D_S>... используем одни типы переменных и функции, для юникода... D_S>#else D_S>... используем соответственно другие...
D_S>Т.е. в каких случаях в системе определен Unicode, а в каких нет. D_S>Кроме того, при программировании под XP можно ли считать, что он в любом случае определен?
D_S>Заранее огромное спасибо.
Юникод не может быть определен или не определен в системе, его поддержка может быть реализована либо не реализована. Программа, собранная с определением UNICODE, т.е.
// для Windows API#define UNICODE
// для СRT#define _UNICODE
в Win9x работать не будет, т.к. Win9x не поддерживает Unicode. А в WinNT будет работать на ура, поскольку Unicode является "родным" для NT.
В случае, когда прорамма собрана без определения UNICODE, работать она будет как под 9х, так и под NT.
В NT, функции, работающие с ANSI строками (имена функций заканчиваются на A), являются просто "заглушками", которые конфертируют строки в Unicode и вызывают соответствующие аналоги (имена заканчиваются на W)
Здравствуйте, Кривенко Антон Владимирович, Вы писали:
КАВ>Здравствуйте, maximilian, Вы писали:
M>>в Win9x работать не будет, т.к. Win9x не поддерживает Unicode.
КАВ>Ну есть MSLU, который пусть не идеален, но многие проблемы позволяет решить...
Ну с этим никто и не спорит, просто я счел лишним упоминать про него
Здравствуйте, maximilian, Вы писали:
M>Юникод не может быть определен или не определен в системе, его поддержка может быть реализована либо не реализована. Программа, собранная с определением UNICODE, т.е.
M>
M>// для Windows API
M>#define UNICODE
M>// для СRT
M>#define _UNICODE
M>
...
я извиняюсь, но что-то у меня не сходится немного в голове ...
1) если собираем в Visual Studio на XP, не объявляем в программе Unicode (а в компиляторе нет этого объявления нигде случайно?), вместо функций, "без конкретного суффикса" будут использоваться с суфиксом "A"?
2) M>Программа, собранная с определением UNICODE, в Win9x работать не M>будет, т.к. Win9x не поддерживает Unicode
именно от одного определения не будет работать? Если все функции использовать c суфиксом "A"...
Здравствуйте, Desert_Sun, Вы писали:
D_S>Здравствуйте, maximilian, Вы писали:
M>>Юникод не может быть определен или не определен в системе, его поддержка может быть реализована либо не реализована. Программа, собранная с определением UNICODE, т.е.
M>>
M>>// для Windows API
M>>#define UNICODE
M>>// для СRT
M>>#define _UNICODE
M>>
D_S>...
D_S>я извиняюсь, но что-то у меня не сходится немного в голове ...
D_S>1) если собираем в Visual Studio на XP, не объявляем в программе Unicode D_S>(а в компиляторе нет этого объявления нигде случайно?),
Случайно нет, но можно прописать UNICODE и _UNICODE в Preprocessor Definitions свойств проекта,
либо использовать #define, например, в stdafx.h, если используются Precompiled Headers.
Первый подход более гибкий. Чтобы иметь возможность собирать программу как в Unicode варианте,
так и в ANSI, можно создать соответствующие конфигурации, которые базируются на имеющихся
Debug и Release, назвать их, скажем, DebugU и ReleaseU, и для этих конфикуращий прописать
UNICODE и _UNICODE в Preprocessor Definitions.
D_S>вместо функций, "без конкретного суффикса" будут использоваться с суфиксом "A"?
Да, если не определены UNICODE и _UNICODE.
D_S>2) M>>Программа, собранная с определением UNICODE, в Win9x работать не M>будет, т.к. Win9x не поддерживает Unicode D_S>именно от одного определения не будет работать? Если все функции использовать c суфиксом "A"...
Если явно указать суффикс явно, то будет все пучком
И еще... чтобы иметь возможность собирать как в юникоде так и в анси, вместо типа char следует использовать TCHAR из tchar.h, а строковые и символьные константы заключать в _Т(), например _Т("string") или _T('c')