Я получил 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-стандартом. Но я должен как-то включить заголовки. Любая идея?
Переписать все это будет лишь последним средством.
Я хотел бы включить заголовки в мой проект 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.
Других решений пока нет …