MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   MATLAB和C / C ++。如何在不同的C / C ++规范之间进行选择 (https://www.labfans.com/bbs/showthread.php?t=26248)

poster 2019-12-14 20:13

MATLAB和C / C ++。如何在不同的C / C ++规范之间进行选择
 
我使用Visual C ++ 2010的编译器(cl.exe)从[URL="http://www.mathworks.com/help/techdoc/ref/mex.html"]mex中[/URL] [URL="http://code.google.com/p/randomforest-matlab/"]的第三方库[/URL]编译C ++文件时遇到以下问题。

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

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

[/INDENT]原因似乎是因为mxCreateNumericMatrix [URL="http://www.mathworks.com/help/techdoc/apiref/mxcreatenumericmatrix.html"]采用[/URL]枚举类型作为输入参数[B]4[/B] ,称为mxComplexity , [URL="http://www.mathworks.com/help/techdoc/apiref/mxcomplexity.html"]定义[/URL]为typedef enum mxComplexity {mxREAL=0, mxCOMPLEX}; 。换句话说,编译器抱怨它不能从[B]int[/B]隐式转换为[B]enum type[/B] 。

但是有趣的是,该[URL="http://code.google.com/p/randomforest-matlab/"]库[/URL]应该易于编译,而无需更改其中的任何内容。

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

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

[B]注2:[/B]如果有问题,这是我为[B]mex[/B]所进行的配置(在运行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"'

[B]回答:[/B]

与C不同,C ++不允许从int到枚举值的隐式转换( [I]曾经[/I] !在C ++ 98、2003、0x中不可用),因此您需要对此类参数使用实际的枚举值。

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

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



[url=https://stackoverflow.com/questions/4845707]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:17

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.