Зачем Microsoft в WinApi создает свои макросы для имеющихся в языке определений?

1,00
р.
У меня такой вопрос: зачем Microsoft в WinApi создает свои макросы для имеющихся в языке определений? Например CHAR == char, DOUBLE == double, LPCSTR == char* и так далее.

Ответ
Все очень просто. На самом деле на все стандартные типа накладывается слишком мало ограничений. Тот же char по факту может быть как знаковым, так и беззнаковым. Тот же double может иметь различную длину:
The type double provides at least as much precision as float, and the type long double provides at least as much precision as double.
То есть, точная длина в байтах неведома. Да, для конкретной реализации комплятора она известна, но в общем случае — нет.
А теперь представьте себе ситуацию, что есть много-много строк кода, и в один день разработчики компилятора сказали, что char у них будет беззнаковый (раньше мне такая ситуация показалась бы надуманной. Но теперь, когда ARM и MIPS процессоры прочно входят в нашу жизнь, когда 128 битные платформы не за горами, возможно и не такое). И что теперь делать? Перепроверять тонны кода? Гадать, почему на одной платформе работает, а на другой нет?
Поэтому и определяют свой тип, который имеет гарантированное поведение, а также понятное (легко для поиска и восприятия) и не очень длинное (сравните CHAR и signed char) название.
А вот с типами LPCSTR ситуация ещё интереснее. Помню, когда то давно, когда я только начинал изучать си и плюсы, мне нужно было переписать небольшой код, который работал с трехмерными массивами (для кафедры, где я учился). Передача по указателю, когда у тебя три звездочки подряд, запутывает окончательно. Но если объявить тип вида typedef int*** matrix , то передача по ссылке значительно упрощается ( void func(matrix * data) ) И не нужно думать, сколько там звездочек нужно поставить. От правильно составленной структуры типов продуктивность повышается в разы.