Что такое VX_API_ENTRY и VX_API_CALL в стандарте Khronos openvx? - PullRequest
0 голосов
/ 07 сентября 2018

Я изучаю расширение экспорта-импорта Khronos openvx. при чтении файла vx_import.h я видел

VX_API_ENTRY vx_status VX_API_CALL vxReleaseImport(vx_import *import);  

функция.

Я хочу понять, почему они написали VX_API_ENTRY и VX_API_CALL в функции.

Я новичок в openvx. Если кто-то знает это, пожалуйста, ответьте.

1 Ответ

0 голосов
/ 07 сентября 2018

В заголовке vx_types.h вы можете прочитать:

/*!
 * \internal
 * \def VX_API_ENTRY
 * \brief This is a tag used to identify exported, public API functions as
 * distinct from internal functions, helpers, and other non-public interfaces.
 * It can optionally be defined in the make system according the the compiler and intent.
 * \ingroup group_basic_features
 */

/*!
 * \def VX_API_CALL
 * \brief Defines calling convention for OpenVX API.
 * \ingroup group_basic_features
 */

/*!
 * \def VX_CALLBACK
 * \brief Defines calling convention for user callbacks.
 * \ingroup group_basic_features
 */

Тогда VX_API_ENTRY определяется как пустое, а VX_API_CALL определяется __stdcall в Windows и пусто в противном случае.

Для чего они? Ну, они определяют соглашение о вызовах API и в то же время, как говорится в комментарии, документируют, какие функции на самом деле являются общедоступными.

Например, в Windows публичные функции из DLL иногда имеют префикс declspec(__dllimport) для указания компилятору использовать таблицу функций импорта, ваша система сборки может определить для этого VX_API_ENTRY.

__stdcall - это соглашение о вызовах , используемое этой библиотекой. Обычно вы не указываете это и позволяете компилятору выбирать значение по умолчанию. Но в общедоступной DLL хорошей идеей является не полагаться на значения по умолчанию, поскольку компилятор DLL и компилятор EXE могут использовать разные значения, и это нарушит связь.

Но в основном, как конечный пользователь API, вы можете просто игнорировать их, они просто работают.

За исключением VX_CALLBACK! Вы должны объявить свои обратные вызовы как VX_CALLBACK, иначе вы рискуете потерять код на некоторых архитектурах (в основном, Windows).

...