Использование VLA в среде C ++ 11

Я получил C-код, который уже существует и использует VLA в стиле C99. Как этот:

 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-стандартом. Но я должен как-то включить заголовки. Любая идея?

Переписать все это будет лишь последним средством.

3

Решение

Я хотел бы включить заголовки в мой проект C ++ 11. Поскольку C ++ не допускает подобные конструкции, я использую extern «C» для включения этих заголовочных файлов. Однако компилятору это совсем не нравится.

Действительно, это проблема, так как C ++ 11 не имеет Влас. Возможно, вы захотите написать оболочку в C, скомпилировать ее как C и использовать ее в C ++.


Я думаю, что где-то читал, что VLA стали необязательными в C11. Значит ли это, что gcc полностью избавился от него?

Нет, gcc по-прежнему поддерживает VLA при компиляции кода как C11. Однако это не имеет отношения к вашему вопросу, который касается C ++ 11, совершенно другого языка, который не поддерживает VLA.


что я могу сделать кроме extern «C»?

extern "C" одно не поможет вам, потому что, как я объяснил, в C ++ 11 нет VLA. Учтите, что в C массив является смежный последовательность, то есть все одно распределение а также все элементы встречаются один за другим. Следовательно, такой двумерный массив представляется сплющенным как одномерный массив n * n элементы. Ваша обертка, также использующая extern "C", должен перевести double * указывая на первый элемент этого плоского массива к double (*)[n] указывая на первый n элементы этого сплющенного массива.

Это типовое преобразование в C11, которое не нужно подвергать C ++, потому что функция, которая принимает double *функция скомпилирована как код C11 (не C ++ 11) и связан с проектом C ++ 11 с использованием компоновщика. C ++ 11 не должен видеть код C11 под функцией.

Таким образом, вам нужно будет переписать заголовок (который вы можете сохранить независимо от .h файл как .hpp файл), который, к счастью, не является полный переписать. По крайней мере, надеюсь, вы узнали, C ++ не является строгим надмножеством C.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector