Ответ 1
Это редко используемая функция из расширения C99 GNU (документация GCC), которая используется для пересылки-объявления параметров, используемых в VLA declarators.
matrix_* matrix_insert_values(int n; double a[][n], int m, int n);
Вы видите, как int n
появляется дважды? Первый int n;
является просто прямым объявлением фактического int n
, которое находится в конце. Он должен появляться перед double a[][n]
, потому что n
используется в объявлении a
. Если бы вы были в порядке с переупорядочиванием параметров, вы могли бы просто положить n
до a
, а затем вам не понадобится эта функция
matrix_* matrix_insert_values_rearranged(int m, int n, double a[][n]);
Примечание о совместимости с С++
Чтобы быть ясным, расширение GNU является просто декларацией параметров функции. Следующим прототипом является стандарт C:
// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);
Вы не можете вызывать эту функцию из С++, потому что этот код использует массивы переменной длины, которые не поддерживаются в С++. Вам нужно будет переписать функцию, чтобы иметь возможность вызвать ее из С++.