查看单个帖子
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB和C / C ++。如何在不同的C / C ++规范之间进行选择

我使用Visual C ++ 2010的编译器(cl.exe)从mex中 的第三方库编译C ++文件时遇到以下问题。

编译器在一条语句中多行抱怨,如下所示:

plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0); 与:
错误C2664:'mxCreateNumericMatrix_730':无法将参数4从'int'转换为'mxComplexity'

原因似乎是因为mxCreateNumericMatrix 采用枚举类型作为输入参数4 ,称为mxComplexity , 定义为typedef enum mxComplexity {mxREAL=0, mxCOMPLEX}; 。换句话说,编译器抱怨它不能从int隐式转换为enum type

但是有趣的是,该应该易于编译,而无需更改其中的任何内容。

因此,我的问题是:与其在发生这种情况的每一行中添加一个显式的强制转换不如告诉mexcl.exe (或gcc ,如果我在Unix中这样做的话),我想执行一个C式类型隐式转换?

注意1:不幸的是,我不知道该库是用什么C ++标准编写的。

注2:如果有问题,这是我为mex所进行的配置(在运行mex -setup之后默认由MATLAB进行设置):

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不同,C ++不允许从int到枚举值的隐式转换( 曾经 !在C ++ 98、2003、0x中不可用),因此您需要对此类参数使用实际的枚举值。

或者,您也可以将其编译为C,因为他们编写的代码不是C ++(由于上述原因)。
注意1:不幸的是,我不知道该库是按照什么C ++标准编写的

没关系,C ++标准是向后兼容的,并且此代码肯定没有在C ++ 0x中使用新功能,因此您的编译器很好。更改C ++编译模式将不允许您隐式进行上述转换。



更多&回答...
poster 当前离线   回复时引用此帖