Q:

Макросы в WinAPI

Почему в WINAPI так много макросов, которые по сути являются одним и тем же?
Вот например WINAPI и CALLBACK являются по сути одним и тем же, но с разными названиями.
К чему было придумано это буйство типов?

A:

Из тех же самых соображений, почему мы придумываем разные имена переменных, а не используем i1, i2, i3... для целых и b1, b2, b3... для булевых. Имя типа, переменной, класса, и т.д. должно отражать его назначение и давать максимум информации о его использовании. Префикс WINAPI говорит о том, что функция является частью Windows API, и подчиняется его соглашению о вызове (calling convention). CALLBACK говорит о том, что это пользовательская функция, вызываемая какой-то функцией WinAPI. Тот факт, что где-то в дебрях windef.h они обе определены как __stdcall, не более чем совпадение, которое программиста вообще интересовать не должно. И кстати, что касается именно этих определений, то совпадают они не для всех платформ.
Еще одна цель определений WinAPI - независимость от платформы. Если я объявляю переменную как DWORD, мне неважно, что именно в моей системе она будет объявлена как unsigned long. Достаточно знать, что она будет четырехбайтовой на любой платформе, даже там, где long имеет длину 64 бита.

