Объявления функций с помощью макросов для поддержки нескольких платформ


Я писал на C++ плагин, который извлекает пиксел на экране. Он работает на Windows и Android. Я заметил, что dllexport требуется только для Windows, но не на Android и вызывает ошибки на другие платформы, отличные от Windows. Я исправил это с помощью #if макрос, чтобы сделать его использовать dllexport только на Windows.

Вот исправленный код заголовка:

#ifndef ANDROIDSCREENSHOT_NATIVE_LIB_H
#define ANDROIDSCREENSHOT_NATIVE_LIB_H

#define DLLExport __declspec(dllexport)

extern "C"
{
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY)
DLLExport void initScreenPointPixel(void* buffer, int x, int y, int width, int height);
DLLExport void updateScreenPointPixelBufferPointer(void* buffer);
DLLExport void updateScreenPointPixelCoordinate(int x, int y);
DLLExport void updateScreenPointPixelSize(int width, int height);
int GetScreenPixels(void* buffer, int x, int y, int width, int height);

#else
void initScreenPointPixel(void *buffer, int x, int y, int width, int height);
void updateScreenPointPixelBufferPointer(void *buffer);
void updateScreenPointPixelCoordinate(int x, int y);
void updateScreenPointPixelSize(int width, int height);
int GetScreenPixels(void *buffer, int x, int y, int width, int height);
#endif
}
#endif //ANDROIDSCREENSHOT_NATIVE_LIB_H

Он работает и решает проблему, но мне не нравится тот факт, что я должен объявить каждая из этих функций в два раза. Один раз в #if и еще в #else заявление. У меня есть много функций, если не тысячи, и если я идти по этому пути, то код будет излишним долго. Простая цель-удалить dllexport на не Windows на платформе без объявления функции в два раза , как я сейчас делаю.

Есть ли лучший способ сделать это с помощью макроса без того, чтобы снова объявить каждой функции? Любое решение без макросов тоже хорошо, пока мне не придется декларировать каждую функцию несколько раз.



96
3
задан 13 апреля 2018 в 05:04 Источник Поделиться
Комментарии
1 ответ

Сохранить макрос с атрибутом dllexport на всех платформах, но сделать определение решимость ничего, если вы на Windows. Возможно, вы захотите переименовать макрос на нечто более нейтральное. Что-то вроде этого:

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY)
# define EXPORT __declspec(dllexport)
#else
# define EXPORT
#endif

extern "C"
{
EXPORT void initScreenPointPixel(void* buffer, int x, int y, int width, int height);
}

Вы также должны быть осведомлены о том, что extern "C" вещество распознается только на C++ компилятор. Соответствующие заявления должны быть условными, например:

#ifdef __cplusplus
extern "C" {
#endif

... declarations here

#ifdef __cplusplus
}
#endif

6
ответ дан 13 апреля 2018 в 06:04 Источник Поделиться