2009-02-09 6 views
8

Я искал через некоторый код из SDL библиотеки и наткнулся на функции объявлены следующим образом:Что делает объявление CALLBACK в C?

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 

Теперь я программист Delphi. Нет hablo C muy bien, senor. Но я помню достаточно синтаксиса из своих курсов в колледже, чтобы прочитать его так:

Имя функции WndProc. Список аргументов довольно понятен. Возвращаемый тип функции - LRESULT. Но что в мире такое, что «CALLBACK» делает там? В Delphi любая функция может использоваться как обратный вызов; вам просто нужно передать правильный тип указателя функции. Есть ли какая-то особая причина, почему C не работает таким образом? Или это означает что-то другое?

ответ

2

Это соглашение о вызовах. Это необходимо, когда вы передаете указатель на эту функцию в Windows API, который позже вызывает эту функцию. Соглашение о вызове Windows отличается от соглашения о вызове C, поэтому вам нужно указать компилятору, что WndProc() является специальным, и что ему нужен другой код запуска и очистки.

0

Это конвенция о вызове, и у Дельфи тоже есть их. Попробуйте найти «cdecl» в справке Delphi. В Delphi (или Object Pascal, как мы старики называем это) вызывающие соглашения приходят после объявления функции, например:

function MyFunction(X, Y: Real): Real; cdecl; 
4

Short облава из блога Раймонда Чена:

Большая вещь о вызове соглашения на платформе x86 является , что есть так много, чтобы выбрать из!

C соглашение о вызовах (__cdecl)

Вызывающий конвенции С ограничена, поскольку она позволяет использовать функции с переменным числом параметров. В значительной степени требуется, чтобы стек очищался и чтобы параметры были сдвинуты справа налево, так что первый параметр находится в фиксированной позиции относительно вершины стека. В итоге: Caller очищает стек, параметры сдвигаются вправо.

Паскаль соглашение о вызовах (__pascal)

Pascal не поддерживает функцию с переменным числом параметров, так что он может использовать вызываемый абонент-чистой конвенцию. Параметры сдвигаются слева направо. Почти все функции Win16 экспортируются как соглашение о вызове Pascal. Согласие на освобождение вызываемого абонента сохраняет три байта в каждой точке вызова с фиксированной накладной стоимостью двух байтов на каждую функцию. Это было также значительно быстрее. В Win16 сэкономить несколько сотен байт и несколько циклов было большим делом. Примечание. Соглашение о вызове Fortran (__fortran) совпадает с соглашением о вызове Pascal.