2013-09-10 5 views
0

Я пытаюсь прочитать документацию по проекту. Под названием Прототип, у меня этот код:Является ли это интерфейсом или прототипом функции?

VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( 
    VisionAPI_HANDLE ImageHandle , 
    uint32_t NumImages 
); 

Интерфейсы проекта будут строить в C, когда функции будут находиться в C++. При чтении документации я читаю прототип, поэтому я предположил, что это «прототипы функций». Когда я читаю больше, я иногда нахожу автора, используя термин «функция», а иногда «интерфейс». Я знаю, как создать интерфейс в C++, но не в C.

Так что же код выше о интерфейсе или прототипе функции?

В противном случае как создать интерфейс на языке C? Создать структуру (struct)?

Надеюсь, мой вопрос не глуп. Я разработчик Java и простой ученик C/C++.

ответ

1

(Добавление к уже полезной информации, заданной @bitmask и @dasblinkenlight)

В 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_RETURNVisionAPI скорее всего определены как макросы. Из их имен я предполагаю, что первый расширится до фактического типа возврата, а второй может быть либо пустым макросом (обычно используется для обозначения какой-либо категории объявлений), либо расширяется до некоторой комбинации ключевых слов для компилятора, обычно используемой для объявления функции низкоуровневый вызов.

Например, где-то может быть эти макроопределения:

#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 (многие компиляторы имеют какие-то такие расширения).

+0

Привет! Пожалуйста, каков будет тип возврата в моем случае? VisionAPI_RETURN или VisionAPI? и что будет другим? Благодаря! – loulou

+0

@ user1847726 см. Мои правки. –

2

Это объявляет функцию без предоставления реализации (определение). Итак, вы можете сказать, что это интерфейс. Вы просто скажите компилятору: «Эй, есть функция с именем VisionInterf_ImageAttach« поэтому она не жалуется, когда вы ее вызываете. More about declaration vs. definition.

Это, конечно, зависит от того, что VisionAPI_RETURN и VisionAPI решить, считая, что это макросы.

+0

Я предполагаю, что у меня есть только «один возвращаемый тип», и вот у меня есть: VisionAPI_RETURN VisionAPI, как мне это интерпретировать? Спасибо – loulou

+1

@ user1847726: Я очень подозреваю, что оба (или хотя бы один) являются макросами '# define' и разрешают что-то другое. Попытайтесь выяснить, где они определены или посмотреть на предварительно обработанный файл ('gcc -E'). – bitmask

+0

Спасибо, сэр за команду и дал мне! Я попробую. +1 – loulou

2

Нет такой вещи на языке C как интерфейс: в дополнение к примитивным типам и указателям язык поддерживает struct s и функции; это все, с чем вам нужно работать.

В вашем коде показан пример прямого объявления функции. Интерфейсы к модулям C состоят из нескольких таких объявлений, а также декларации struct s, которые используются этими функциями.

+0

+1. Спасибо, сэр. для утверждений, которые вы мне дали о языке C. Это экономит время от поиска чего-то, чего не существует. – loulou

Смежные вопросы