2016-04-04 1 views
2

В чем разница между мной, явным образом определяющим каждый API Win32, который я использую в своем проекте как W (Wide) или A (ANSI), и позволяя ему решать конфигурацию решения/проекта? Кроме того, будучи в состоянии изменить его на лету, то есть.Разница между явным использованием API-интерфейсов Unicode/ANSI Windows и возможностью их обработки с помощью псевдонимов?

Скажем, мне нужен только Юникод в данный момент по какой-то причине, было бы лучше, если бы я просто позволил им автоматически перейти к правильному или явно определить их? Может ли это разорвать некоторые системы при выпуске, если я буду разрабатывать только ANSI или Unicode, а также поддерживать оба?

+2

Если по какой-либо причине Microsoft решает использовать UTF32 вместо UTF16 и обесценить широкоформатные функции, если вы используете псевдонимы и макросы 'T'-family, то все, что вам нужно сделать, это перекомпиляция и он должен (надеюсь) работать нормально. Если вы используете функции напрямую, вам предстоит еще много работы. Это очень маловероятный сценарий, но единственное, что я могу себе представить на вершине моей головы на данный момент. –

+3

Преимущество использования типов и функций Unicode, а не макросов заключается в том, что ваш код более четкий. Вы не собираетесь поддерживать Windows 98, поэтому зачем писать код для этого. Вы не будете компилироваться без поддержки Unicode. Держите жизнь простой и избегайте ненужного обращения. –

+1

@DavidHeffernan: общие текстовые сопоставления действительно больше, чем просто архаичные остатки прошлого. Они служат в качестве переключателя, который можно контролировать извне. Вряд ли это может быть так, комментарий Йоахима изложил один сценарий, где общие текстовые сопоставления могут быть правильным способом продвижения вперед. – IInspectable

ответ

3

Последние версии Windows, которые были основаны на кодировке ANSI (Windows 9x), давно закончились. Все новые версии (основанные на NT), даже встроенные, используют UTF-16 для обеспечения полной поддержки Unicode. Для всех функций ANSI реализованы как обертки, которые вызывают накладные расходы (для преобразования требуется время и пространство) и потеря данных (ANSI - это только подмножество Unicode).

Я бы использовал только широкие версии. В частности, при экспорте интерфейсов я бы воздержался от использования строк на основе TCHAR, потому что это потребует от меня предоставления двух разных реализаций и потому что это не обязательно для современного кода.

+0

Это довольно ясно. Благодаря! – Banderi

1

Основная причина, по которой вы должны предпочесть варианты W, заключается в том, что A-вызовы ненадежны, когда вы имеете дело со строками - они всегда подразумевают неявную кодовую страницу, которая является переменной. Таким образом, поведение программы зависит от системных настроек, которые никогда не бывают хорошими. Шансы на то, что они будут переопределять TCHAR в будущем, очень близки к нулю - в этом изменении нет технического преимущества, и это сломает много вещей, поэтому беспокоиться об этом не имеет смысла.

Смежные вопросы