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). Это главное достоинство соглашений об именах в венгерской нотации.
Теперь, когда вы получили представление о венгерской нотации, рассмотрим наиболее популярные префиксы (в алфавитном порядке).