116 ____Часть II. Программирование на C++

взятом фрагменте кода. Строгое следование венгерской нотации (как и любым другим соглашениям об именах) придает единообразную и, как следствие, легко читаемую структуру вашим программам.

Если вам приходилось читать книги по Windows API или пользоваться опцией Help в Borland C++, то первое представление о венгерской нотации у вас уже есть. Например, если вам нужно выделить блок памяти, то Borland C++ даст вам следующую справку:

HGLOBAL GiobalAlloc(UINT fuAlloc, DWORD cbAlloc);

Сразу обращают на себя внимание имена переменных fuAlloc и cbAlloc. Если вы знакомы с венгерской нотацией, то наверняка спросите себя: что может значить fu и cb?

Идентификаторы в венгерской нотации состоят из последовательности префиксов, или базовых типов и спецификаторов. Данный случай расшифровывается как

fuAlloc = f (flag) + u (unsigned int) + Ailoc cbAlloc = с (count) + b (bytes) + Alloc

fuAlloc — это беззнаковый целый флаг (flag), определяющий способ выделения памяти, а cbAlloc задает счетчик (count) количества байт.

Вот типичный пример использования GiobalAlloc:

HGLOBAL hGlobal;

void *IpvBuffer;

hGlobal = GiobalAlloc(GPTR, 32 * 1024);

IpvBuffer = GlobalLock(hGlobal);

GlobalOnlock(hGlobal);

GlobalFree(hGlobal) ;

Здесь объявлены дескриптор (handle) глобальной области памяти hGlobal и длинный пустой (типа void) указатель на буфер IpvBuffer. Функция GiobalAlloc запрашивает блок памяти в 32К, возвращаемый ею дескриптор помещается в hGlobal; GlobalLock блокирует блок памяти, идентифицируемый дескриптором, возвращая пустой указатель в IpvBuffer. Заметьте, что обе используемые в этом фрагменте переменные — hGlobal и IpvBuffer -носят имена не просто содержательные, но и информативные с Точки зрения типов данных (handle и long pointer to void). Это главное достоинство соглашений об именах в венгерской нотации.

Теперь, когда вы получили представление о венгерской нотации, рассмотрим наиболее популярные префиксы (в алфавитном порядке).