Почему Microsoft выбрала stdcall в качестве соглашения об API?

Есть ли веская причина?

Являются ли их внутренние функции (не экспортируемые) стандартным соглашением?

2 ответа

Решение

Это была адаптация к паскальскому соглашению о вызовах для 32-битного кода. Паскаль был соглашением о вызовах для 16-битных операционных систем, таких как OS/2 и Windows 3. Почему Паскаль был выбран, является немного догадкой, даже тогда я был маленьким щенком, но он немного более эффективен. Что имело значение, когда 640 КБ было всем, с чем вам приходилось работать.

Большинство функций Win32 не являются истинными stdcall, поскольку они также предписывают, как экспортируется экспортируемая функция перед ее представлением компоновщику. Как void Mumble(int arg) становится _Mumble@4. Число после @ описывает размер кадра активации. Но большинство функций Win32 экспортируются без каких-либо украшений. Возможно, дать программисту реальный шанс заставить работать GetProcAddress(). Я думаю, что украшение было предназначено, чтобы помочь компоновщику обнаружить несоответствия между объявленной сигнатурой функции API и действительной сигнатурой. Несоответствие в количестве переданных аргументов является автоматическим kaboom, поскольку вызываемый объект будет выдавать больше или меньше аргументов из стека, чем было передано. Тяжело диагностировать тоже. Слабость stdcall, конвенция cdecl не имеет этой проблемы.

Внутренние вызовы - это смешанный пакет между stdcall, cdecl и thiscall. Не могу сказать, что я когда-либо обнаружил шаблон, хотя одношаговый код Windows мне не нравится.

Код, скомпилированный с помощью stdcall, значительно меньше кода, скомпилированного с помощью cdecl (альтернатива). В то время, когда решение было принято, меньший код был быстрее кода.

Другие вопросы по тегам