Сторінка 1 з 2
У чому відмінності, коли і які треба застосовувати, які переваги і недоліки?
Різниця в способі передачі параметрів у функцію і повернення параметрів з функції.
stdcall - юзается (на кшталт) а ВІНАП. Передача аргументів справа наліво. Стек очищає викликається процедура. Повертає разультате в EAX (помойму)
pascal - юзалось в він16апі. Передача в аргументів зліва направо. Стек очищає викликається. У Паскалі результат повертався в al, ax або в dx: ax. Як в Дельфи - не пам'ятаю, ймовірно а EAX.
register - передача всього через регістри процесора. Як саме - залежить від компілятора.
cdecl - не пам'ятаю. Начебто теж, що і stdcall, тільки стек чистить викликає процедура
sdecl - виклики в стилі С (для звернення до DLL використовує угоди про виклики в стилі С). Параметри в сет з права на ліво. Очищення - викликає процедурою. Забезпечують обслуговування змінного числа параметрів.
Взято з Vingrad
Ці директиви швидше відносяться до способу (ам) реалізації викликів процедур і передачі (прийому від) параметрів на конкретному машинному мовою при компіляції з мов високого рівня.
Так, наприклад в DOS СІ використовували свої види реалізацій (зазвичай звані C-call), а Паскаль - свій. У win32 також відрізняються реалізації для цих мов, але поступово відбувається запозичення фрагментів реалізацій один у одного і їх симбіози (stdcall).
Якщо ти пишеш тільки на одній мові і не підключаєш зовнішніх бібліотек, створених іншим компілятором (в іншому форматі), то тобі, в принципі, все одно, яка реалізація використовується - компілятор сам прийме вірне рішення і погодить виклики підпрограм в своєму стилі. Виняток, мабуть, становить лише опція "registers" - за змістом це означає пріоритетне використання регістрів процесора для передачі (отримання) даних процедурі. Як правило, це прискорює виклик процедури і повернення з неї: може бути використання для підвищення швидкодії. Однак це зазвичай роблять установкою глобального прапора проекту в момент створення Файнал Реліз, застосовуючи це відразу до всіх підпрограм.
Однак якщо тобі необхідно підключити зовнішню бібліотеку (наприклад, написаний на СІ dll, що викликає в свою чергу апі sql-сервера), то буде необхідно врахувати спосіб передачі параметрів саме цій бібліотеці.
Або при явному виклику win api з коду також потрібно врахувати спосіб їх виклику (stdcall).
Взято з Vingrad