MATLAB和C/C++。如何在不同的C/C++规范之间进行选择?

4

我在使用Visual C++ 2010编译第三方库中的C++文件时,在mex中遇到了以下问题。

编译器在多行代码中抱怨以下语句:

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

使用:

错误 C2664: 'mxCreateNumericMatrix_730': 无法将参数 4 从 'int' 转换为 'mxComplexity'

原因似乎是 mxCreateNumericMatrix 将枚举类型作为第四个输入参数takes,该枚举类型称为 mxComplexity,定义为 typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};。换句话说,编译器抱怨它不能隐式地将 int 转换为 枚举类型

有趣的是,所涉及的库应该可以轻松编译,而无需对其进行任何更改。

因此,我的问题是:是否有一种方法可以告诉 mexcl.exe(或者如果我在Unix中执行此操作,则为gcc)进行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"'

也许这是一个愚蠢的问题,但为什么要使用字面值0而不是mxREAL? - Christoffer
@Amro,我在一天前联系了作者,他对源代码进行了更改(最新版本在SVN存储库中),以避免隐式转换。有趣的是,他说他能够使用VS-2010 express编译旧版本而没有任何问题,所以我仍然保持这个问题的开放状态。你下载了哪个版本?无论如何,如果您可以避免更改代码,我想知道为什么会出现这个编译错误以及如何处理它。 - Amelio Vazquez-Reina
1
@Amro,感谢您关注此事,但我仍然感到困惑。@Alex在下面说C++不允许隐式转换(证实了我的初步猜测)。但是您之前说过您成功编译了旧版本的库(其中包含隐式转换)。该库附带的编译脚本使用cl.exe(当它看到.Cpp扩展名时默认为C++),以及g++(而不是gcc)。 - Amelio Vazquez-Reina
1
@AmV:现在我理解了问题,我和你一样困惑... 举个简单的例子:http://pastebin.com/fmJqkdir ,这个程序在C语言下可以正确编译,但在C++下会抛出编译错误(但不知何故,旧版本库的mex对我来说是成功的!) - Amro
最后你是怎么解决这个问题的?我在编译一些代码时也遇到了同样的错误。我尝试使用“mex -setup C”来编译C语言,但仍然无法工作 :( - f10w
显示剩余8条评论
2个回答

2

C++不允许从int到枚举值的隐式转换(永远都不行!无论是在C++98、2003还是0x中),与C不同,因此您需要使用实际的枚举值作为这样的参数。

或者您可以编译为C,因为他们编写的代码不是C++(因为上面的原因)。

注意1:很遗憾,我不知道库是用哪个C++标准编写的。

没关系,C++标准向后兼容,而且这段代码肯定没有使用C++0x中的新功能,所以您的编译器没问题。更改C++编译模式也无法使您隐式地进行上述转换。


谢谢,那很有道理。有趣的是,该库的作者声称(http://goo.gl/5TbN1)他能够在Windows上使用Visual C++ express编译它,并且在Linux上使用g++进行编译(事实上,我无法使用/Tc选项强制进行C编译来使用gl.exe进行编译,并且库提供的用于Linux安装的make文件使用g++)。 - Amelio Vazquez-Reina

1

首先,确定你正在使用的编程语言。你是在使用C还是C++?

这是它们不兼容的一个领域。


据我所知,该程序是用C++编写的。除其他文件外,这些文件的扩展名为.cpp,最显著的是,它附带的Linux Makefile使用g++ - Amelio Vazquez-Reina
这就解释了为什么你不能隐式转换类型。 “所涉及的库”声称可以这样做,可能是因为他们假设你正在使用C语言。 - Arafangion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接