C++
Comments 20
UFO landed and left these words here
+1

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

+1

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

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

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

0

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

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

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

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

syntax error

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


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

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

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

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

+1
От КО. Видимо, надо вызвать из 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., please.