У меня есть C-Code, который уже существует и использует VLA в стиле C99. Нравится этот:Использование VLA в среде C++ 11
int foo(int n, double l[n][n], double a[n][n]);
Я хотел бы включить заголовки в свой проект на C++ 11. Поскольку C++ не разрешает такие конструкции, я использую extern "C"
для включения этих файлов заголовков. Однако компилятору это совсем не нравится.
./header.h:23:42: error: use of parameter outside function body before ‘]’ token
void foo(int n, double l[n][n], double x[n], double b[n]);
^
./header.h:23:45: error: use of parameter outside function body before ‘]’ token
void foo(int n, double l[n][n], double x[n], double b[n]);
^
./header.h:23:46: error: expected ‘)’ before ‘,’ token
void foo(int n, double l[n][n], double x[n], double b[n]);
^
./header.h:23:48: error: expected unqualified-id before ‘double’
void foo(int n, double l[n][n], double x[n], double b[n]);
^~~~~~
Я думаю, что я где-то читал, что VLA стали необязательными в C11. Означает ли это, что gcc полностью избавился от этого? Если да, то что я могу сделать, кроме extern "C"
? Конечно, я могу скомпилировать источник со старым C-стандартом. Но я должен как-то включить заголовки. Есть идеи?
Переписывание всего этого было бы только методом последней инстанции.
У вас нет никакой альтернативы компиляции источника с помощью компилятора C, поскольку C++ не имеет массивы переменной длины. Я думаю, что массив переменной длины передается как указатель на первый элемент. Следовательно, если вы объявляете свою последнюю функцию «extern» C "{void foo (int n, double * l, double * x, double * b); } 'в вашем коде на C++, его нужно вызвать правильно. (Это, однако, только предположение.) – JohnB
Возможно, вы захотите использовать '--std = gnu ++ 14', который позволяет использовать функции C++ 14, а не' --std == C++ 14', что включает возможности C++ 14 ** и отключает все расширения g ++ ** –
VLA недействительны в стандартном C++ и необязательно в C из C11. Независимо от того, поддерживаются ли они на C или нет, лучше не пытаться использовать их на C++. Вам нужно будет написать «extern» C-оболочку, которая предоставляет интерфейс, приемлемый для C++, и передает (или копирует) свои аргументы на вашу функцию, которая использует VLA. Эта оболочка должна быть реализована (и, следовательно, скомпилирована) как C, но важно, чтобы она предоставляла подпись (тип возвращаемого типа и типы аргументов), которая является допустимой C++. Лично я переписывал функцию как C++ и делал с ней. – Peter