Ответ 1
Правда в том, что на С++ просто нет VLA, которые почти такие же мощные, как у C99, и это, скорее всего, никогда не произойдет; прогресс, который делается для включения ВЛА на язык, настолько сильно ограничен, что они практически бесполезны.
Тем не менее, ваш лучший выбор, скорее всего, напишет некоторые обертки для используемых вами функций библиотеки, которые выставляют интерфейсы стиля
void my_func_wrap(int n, int* my_ints);
Они будут реализованы в C99 файле следующим образом:
void my_func_wrap(int n, int* my_ints) {
my_func(n, my_ints);
}
Как заголовок C, так и файл с реализациями могут быть автоматически сгенерированы из заголовков вашей библиотеки, так как изменение рядом с тривиальным. Теперь вы можете вызывать оболочки из вашего кода на С++ без конфликта типов.
Вторым возможным подходом было бы написать script, который разбивает содержимое всех скобок []
из заголовков библиотек и использует их вместо этого. Это будет работать отлично, потому что даже в C99 объявление
void my_func_wrap(int n, int my_ints[static n]);
распадается на
void my_func_wrap(int n, int* my_ints);
Вот почему я не нуждался в каком-либо приведении в вышеописанную оболочку (я знаю, это звучит безумно, но это правда). Это просто ваш компилятор на С++, который не любит первый вариант синтаксиса.