В моей библиотеке есть функция C, которая прекрасно работает с многомерными массивами:
void alx_local_maxima_u8 (ptrdiff_t rows, ptrdiff_t cols,
const uint8_t arr_in[static restrict rows][static cols],
bool arr_out[static restrict rows][static cols])
__attribute__((nonnull));
И у меня есть unsigned char *
, который я получаю от class
, определенного в openCV.Этот указатель представляет двумерные данные, но это не так, и я должен использовать их с арифметикой указателей (unsigned char *img_pix = img->data + i*img->step + j;
), что мне особенно не нравится.
Я создаю массив bool
того же размера изображения (это реальный массив, поэтому я могу использовать нотацию массива) для хранения результатов функции.
Я мог бы написать почти точную копию alx_local_maxima_u8()
, которая использует толькоуказатель и арифметика указателя, но я хотел бы иметь возможность использовать его повторно, если смогу.
Безопасно ли писать прототип, который использует void *
таким образом, чтобы обмануть C ++ ?:
extern "C"
{
[[gnu::nonnull]]
void alx_local_maxima_u8 (ptrdiff_t rows, ptrdiff_t cols,
const void *arr_in,
void *arr_out);
}
Теоретически void *
может содержать любой указатель, который получит C, и C не получит доступ к данным, которые не принадлежат этим указателям, поэтому единственные проблемы, которые я вижу, - это наложение аunsigned char *
как uint8_t *[]
и пропуск void *
, где ожидается uint8_t *[]
, что может вызвать все виды ошибок компоновщика.Кроме того, я не знаю, будут ли C bool
и C ++ bool
преобразовываться в одно и то же в памяти (я надеюсь, что это так).
Может быть, мне следует написать оболочку на C, которая получает void *
и передает их фактической функции, так что мне не нужно обманывать C ++.
Производительность - это проблема, но я использую -flto
, поэтому любые обертки, вероятно, исчезнут в компоновщике.
Я использую GCC (-std=gnu++17
) в Linux с включенным POSIX.