我在从 third-party library 编译 C++ 文件时遇到以下问题在 mex使用 Visual C++ 2010 的编译器 (cl.exe)。
编译器在多行中提示像下面这样的语句:
plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0);
与:
error C2664: 'mxCreateNumericMatrix_730' : cannot convert parameter 4 from 'int' to 'mxComplexity'
原因似乎是mxCreateNumericMatrix
takes作为输入参数 4 的枚举类型,称为 mxComplexity
,即 defined作为 typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};
。换句话说,编译器提示它无法从 int 隐式转换为 enum 类型。
不过有趣的是,library in question应该可以轻松编译而无需更改其中的任何内容。
因此,我的问题是:不是在出现这种情况的每一行中都添加显式转换,而是有一种方法可以告诉 mex、cl.exe(或 gcc,如果我在 Unix 中这样做),我想做一个 C 风格 类型隐式转换?
注意 1:不幸的是,我不知道该库是用什么 C++ 标准编写的。
注意 2: 以防万一,这是我对 mex 的配置(默认情况下由 MATLAB 设置,运行 mex -设置
):
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"'
最佳答案
C++ 不允许从 int 到枚举值的隐式转换(永远!不是在 C++98、2003、0x 中),与 C 不同,因此您需要使用实际的枚举值这样的参数。
或者您可以编译为 C,因为他们编写的代码不是 C++(由于上述原因)。
Note 1: Unfortunately, I don't know in what C++ standard the library was written
没关系,C++ 标准是向后兼容的,这段代码肯定没有使用 C++0x 中的新内容,所以您的编译器没问题。更改 C++ 编译模式将不允许您隐式执行上述转换。
关于c++ - MATLAB 和 C/C++。如何在不同的 C/C++ 规范之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845707/