В C функция прототипа, грубо говоря, декларация функции подписи, то есть объявление функции имя, возвращаемый тип и типы параметров списка (т.е. типы параметров, которые функция принимает в своем порядке).
Таким образом, в некотором смысле, прототип функции можно рассматривать как интерфейс функции по отношению к коду клиента (в данном случае интерфейс термин используется в общем смысле, в отличие от того, что это означает, что в OOP и Java в частности).
В качестве более простого примера предположим, что вы определены функция, как это:
int MyFunc(double x, char * z)
{
// function body code
}
тогда его прототип будет:
int MyFunc(double x, char * z);
или даже
int MyFunc(double, char *);
поскольку параметр имена необязательны в прототипах функций.
В C нет механизма для создания эквивалентной реплики на интерфейсы Java, хотя часто программисты ссылаются на специально созданные заголовочные файлы C как «интерфейсы». Эти файлы заголовков заполнены прототипами функций и другими объявлениями, которые представляют собой «интерфейс» библиотеки, принадлежащей к клиентскому коду.
Поэтому код клиента может #include
эти файлы заголовков для доступа к средствам, предлагаемым библиотекой, не зная о его реализации (здесь есть «интерфейс»), что обычно разрешается во время соединения (или во время выполнения, если динамическая компоновка вовлечен).
Редактировать (ответить на комментарий)
То, что вы видите перед именем функции, вероятно, некоторые макро трюк. Поскольку я не знаю, какой контекст я могу только догадываться. Два идентификатора VisionAPI_RETURN
VisionAPI
скорее всего определены как макросы. Из их имен я предполагаю, что первый расширится до фактического типа возврата, а второй может быть либо пустым макросом (обычно используется для обозначения какой-либо категории объявлений), либо расширяется до некоторой комбинации ключевых слов для компилятора, обычно используемой для объявления функции низкоуровневый вызов.
Например, где-то может быть эти макроопределения:
#define VisionAPI_RETURN int
#define VisionAPI
так, что, после того, как препроцессор закончит свою работу, компилятор увидит это:
int VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
Другой пример - если эти макросы определяются следующим образом:
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
то прототип будет расширен, как это:
struct MyReturn __stdcall VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
В этом случае возвращаемый тип будет struct MyReturn
, в то время как __stdcall
ключевое слово будет указать "stdcall" calling convention (__stdcall
используется ключевое слово компилятором Microsoft). Этот результирующий синтаксис является расширением стандартного синтаксиса C (многие компиляторы имеют какие-то такие расширения).
Привет! Пожалуйста, каков будет тип возврата в моем случае? VisionAPI_RETURN или VisionAPI? и что будет другим? Благодаря! – loulou
@ user1847726 см. Мои правки. –