2015-05-26 2 views
1

У меня есть библиотека, которая определяет функцию следующим образом:C на C++ Массив вопроса преобразования указателей

int MAG_robustReadMagModels(char *filename, MAGtype_MagneticModel *(*magneticmodels)[], int array_size) 

библиотека была написана на C. Я пытаюсь использовать его в C++, как это:

MAGtype_MagneticModel* Models[1]; 
MAG_robustReadMagModels(filePathNative, &Models, 1); 

Каким образом он используется в примерах программ. Однако я получаю сообщение

Error C2664 'int MAG_robustReadMagModels(char *,MAGtype_MagneticModel *(*)[],int)': cannot convert argument 2 from 'MAGtype_MagneticModel *(*)[1]' to 'MAGtype_MagneticModel *(*)[]'  

И когда я пытаюсь скомпилировать его и во время кода времени.

Кроме того, я не смог динамически распределить нестандартный массив или наложить двойной указатель на нужный тип *(*)[] Я предполагаю, что это языковая несовместимость между C и C++. Как мне обойти это?

+0

Попробуйте использовать 'reinterpret_cast <>()', это устранит ошибку. Следовательно, это будет теперь 'MAG_robustReadMagModels (filePathNative, reinterpret_cast (& Models), 1);' –

+0

В этом потоке stackoverflow обсуждаются различия между reinterpret_cast <> и static_cast <> http://stackoverflow.com/ вопросы/573294/when-to-use-reinterpret-cast, как и этот stackoverflow http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast -be-used –

ответ

0

Я ожидаю, что некоторые компиляторы будут более или менее строго об этом.

Простейшей вещью, которую я нашел, было просто использовать стиль C.

Следующие компилирует для меня с Visual Studio 2005.

MAG_robustReadMagModels(filePathNative, (MAGtype_MagneticModel *(*)[]) &Models, 1); 

Когда я извлекаю актерский стиль C и использовать только &Models, я получаю ошибку компилятора:

error C2664: 'MAG_robustReadMagModels' : cannot convert parameter 2 from 'MAGtype_MagneticModel *(*__w64)[1]' to 'MAGtype_MagneticModel *(*)[]' 

Смотрите также это stackoverflow discussion on C style cast.

Этот stackoverflow discussion on Performance hit from C++ style casts сравнивает и отталкивает стили C++ с использованием стилей стиля C.

И это stackoverflow discussion on Is it possible to completely avoid C-style casts in C++ имеет некоторые интересные моменты о различиях.

+0

Самая запутанная вещь заключается в том, что clang принимает 'MAGtype_MagneticModel * (* magnetmodels) []' как параметр функции, что явно является [ошибкой, сообщенной в 2010 году] (https://llvm.org/bugs/ show_bug.cgi? id = 7468), поскольку [такие объявления являются незаконными в C++, но законными в C] (http://stackoverflow.com/questions/6936254/why-is-functionchar-array-a-valid-function-definition -but-not-char-arra) – vsoftco

+0

@vsoftco, проблема с приложением стиля C заключается в том, что вы в основном говорите компилятору, что знаете о том, что нужно, чем компилятор, и я никогда не чувствовал себя комфортно в этом. Я хотел бы сделать проверку, чтобы убедиться, что данные передаются функции правильно. –

+0

Если тип параметра является просто «MAGtype_MagneticModel **» вместо 'MAGtype_MagneticModel * (*) []' (который должен быть незаконным в C++), то передача 'Models [0]' должна работать, см. Простой пример [ здесь] (http://ideone.com/Fs4LLK). – vsoftco

Смежные вопросы