ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Category:

С++: типы переменных в Windows API

При использовании набора функций Windows API после изучения языка программирования C++ программист неожиданно попадает в незнакомый мир, наполненный кучей непонятных типов переменных. Например: BOOL, DWORD, LPDWORD, BYTE, LPBYTE, LPCWSTR и так далее.

В среде «Visual Studio Community 2017» при включении в программу заголовочного файла windows.h эти типы становятся доступны и выясняется, что это на самом деле — макросы, под личиной которых скрывается привычная система типов языка Си (для программистов на Си и C++, естественно; при использовании функций Windows API в других языках программирования под этими макросами скрываются базовые типы тех языков).

Например, в вышеуказанной среде «Visual Studio Community 2017»:
BOOL int
DWORD unsigned long
LPDWORD DWORD *
BYTE unsigned char
LPBYTE BYTE *
WCHAR wchar_t
LPCWSTR const WCHAR *
и так далее...

Со временем начинаешь понимать этот «тайный язык» (стандарт оформления кода). Например, уже видно, что приставка «LP» означает «указатель», а название макроса LPCWSTR состоит из трех частей: LP(указатель) + С(константный) + WSTR(строка из широких символов), то есть «константный указатель на строку из широких символов».

Эти макросы — часть стандарта оформления кода, который часто называют «венгерской нотацией». Такое название эта нотация получила благодаря предложившему ее программисту компании Microsoft венгерского происхождения Чарльзу Си́мони. Эта нотация фактически стала внутренним стандартом Microsoft.

Есть множество «за» и «против» применения этой нотации. Недоброжелатели шутят, что эту нотацию не зря назвали «венгерской», намекая на то, что венгерский язык считается одним из самых сложных в изучении (по мне — так ничего особо сложного в венгерской нотации нет).

Применять или нет? Лично я согласен с мыслью, высказанной одним из комментаторов на портале «Stack Overflow»: «when in Rome, do as the Romans do» (наш эквивалент этой пословицы — «в чужой монастырь со своим уставом не ходят»), то есть если применяешь функции Windows API, то будет логично использовать и соответствующие макросы для определения переменных-аргументов функций Windows API.

Всё-таки, зачем придумали эту нотацию? На этот вопрос ответил еще один комментатор с портала «Stack Overflow». Примерный перевод с английского:

Набор функций Windows API впервые был создан еще в 1980-х и должен был поддерживать несколько различных архитектур ЦПУ и компиляторов все эти годы. Его создатели шли от однопользовательских автономных систем с одним процессом к сетевым многопользовательским многоядерным заботящимся о безопасности системам. Они должны были работать с 16-разрядными и 32-разрядными процессорами, а затем и с 64-разрядными. Они должны были решать проблемы с компиляторами языка Си до появления версии этого языка стандарта ANSI. Они должны были обеспечить поддержку компиляторов языка C++ в те годы, когда он еще не был стандартизирован. Они должны были разобраться с сегментацией памяти. Они должны были обеспечить поддержку интернационализации перед появлением Юникода. Они должны были обеспечить какую-то совместимость с исходниками, написанными в MS-DOS, OS/2 и Mac OS. Они должны были запускать программы на разных поколениях микросхем Intel, PowerPC, MIPS, Alpha и ARM. Один и тот же базовый API используется на настольном компьютере, сервере, мобильных и встроенных системах.

В далеких 1980-х язык Си считался высокоуровневым языком (!) и многие считали правильным использовать абстрактные типы, а не определять переменные как примитивные int, char или void *. Из-за того, что в те времена у нас не имелось ни IntelliSense (технология автодополнения), ни подсказок, ни продвинутых редакторов кода, ни онлайн-документации и тому подобного, такое использование названий типов обеспечивало подсказки и поэтому было легче переносить код между различными компиляторами и различными языками программирования.

Да, в итоге получилась ужасная мешанина, что, однако, не означает, что ее авторы делали что-то неправильно.
Tags: Английский язык, История, Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments