Comments 20
UFO landed and left these words here

Особенно второй параметр интересен, rvalue-ссылка на указатель это вообще зачем? Или это какой-то особый диалект языка, ссылка на ссылку?

extern "C" намекает, что это не Си, а С++. А в плюсах && как тип данных имеет только одно значение.

extern "C" вроде же как раз намекает прямо говорит, что функция использует соглашения линковки С, обычно она где-то в *.c файле реализована. Хотя ничего не мешает наверное и С++-функцию так объявить.

Где функция реализована — совершенно не важно. Важно лишь, что компилятор Си посчитает такую конструкцию синтаксической ошибкой — а значит, если я вижу extern "C", значит я смотрю на C++.

Константная rvalue-ссылка на указатель! Два раза "это вообще зачем?"...

3х мерный массив? )
просто подумал, для чего в принципе можно это использовать…

Это просто шикарно — отдельная утилита чтобы парсить объявления типов в человекочитаемый вид.

void byteMaskDowngrade(byte***const byteMask, const byte *const *const && source);

syntax error

void byteMaskDowngrade(byte***const byteMask, const byte *const *const && source){}


bad character '{'
А еще давным давно изобрели typedef. Лучше лестница из typedef'ов, чем это.
Если только целью не была обфускация.

Меня больше интересует другой вопрос: размеры структур по указателям какой размер имеют? И нет ли там в коде выхода за границы массива?

Зашел только ради того что бы узнать зачем была такая конструкция в продакшене… и ответа на этот вопрос здесь нет.

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

От КО. Видимо, надо вызвать из C++ C-функцию, принимающую адрес массива 2-х мерных массивов байт, 1-мерного массива строк, например. Явный decay to pointers потенциально означает лишь то, что строки это может быть jar-array. И еще один адрес 2-х мерного массива байт, только в этом случае полной константы. Что-то вроде:
void byteMaskDowngrade(char (**p1)[], char const (*p2)[][]);  

Пустые trailing квадратные скобки можно по вкусу менять на константные leading *. Не скажу, что уверен на сто процентов, но подобные функции нет-нет да и да, встречались во всяких сишных «зияющих высотах». Трудно это сделать на C, да и на C++ не сильно легче, имхо.
Правая ссылка, видимо, эксцесс C++ разработчика, она при переходе в extern «C» вроде должна в указатель обратиться, не скажу, что добавляет понимания...)))
Мне лично напоминает попытку C++ осмысления заковыристого объявления библиотеки на C: где-то добавлен C++, а где-то «нешмагля».
Only those users with full accounts are able to leave comments. Log in, please.