MATLAB и C / C ++.Как выбрать между различными спецификациями C / C ++ - PullRequest
4 голосов
/ 31 января 2011

У меня следующая проблема при компиляции файла C ++ из сторонней библиотеки в mex с использованием компилятора Visual C ++ 2010 (cl.exe).

компилятор жалуется в несколько строк на оператор, подобный следующему: *

plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0);

с:

ошибка C2664: 'mxCreateNumericMatrix_730': невозможно преобразовать параметр 4 из 'int' в 'mxComplexity '

причина, по-видимому, заключается в том, что mxCreateNumericMatrix принимает тип перечисления в качестве входного аргумента 4 , называемый mxComplexity, то есть определено как typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};.Другими словами, компилятор жалуется, что не может неявно преобразовать из int в тип перечисления .

Интересно, что рассматриваемая библиотека должна легко компилироваться без необходимости что-либо менять в ней.

Поэтому мой вопрос: вместо добавления явного преобразования вв каждой строке, где это происходит, есть ли способ сообщить mex , cl.exe (или gcc , если бы я делал это в Unix), чтоЯ хочу сделать неявное преобразование типа C-style ?

Примечание 1: К сожалению, я не знаю, в каком стандарте C ++ была написана библиотека.

Примечание 2: В случае, если это имеет значениеэто конфигурация, которую я имею для mex (которая устанавливается по умолчанию MATLAB после запуска mex -setup):

 CompilerExecutable: 'cl'
              CompilerFlags: '/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD'
          OptimizationFlags: '/O2 /Oy- /DNDEBUG'
                 DebugFlags: '/Z7'
           LinkerExecutable: 'link'
                LinkerFlags: '/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /MACHINE:X64 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"'
    LinkerOptimizationFlags: ''
           LinkerDebugFlags: '/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"'

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

C ++ не допускает неявное преобразование из int в значения enum ( ever ! Не в C ++ 98, 2003, 0x), в отличие от C, поэтому вам нужно использовать фактические значения перечисления параметр.

Или вы можете скомпилировать как C, так как код, который они написали, не является C ++ (из-за вышеизложенного).

Примечание 1: к сожалению, я не знаю, в какой стандарт C ++ была в библиотеке написано

Неважно, стандарты C ++ обратно совместимы, и этот код определенно не использует что-то новое в C ++ 0x, поэтому ваш компилятор в порядке. Изменение режима компиляции C ++ не позволит вам неявно выполнять вышеупомянутое преобразование.

1 голос
/ 31 января 2011

Сначала выясните, какой язык вы используете. Вы используете C или C ++?

Это одна область, где они несовместимы.

...