我目前正在将一些32位Matlab的C MEX文件移植到64位Matlab。
在这样做时,我遇到了两种类型,一种来自Matlab人员,另一种是C标准。
这是Matlab文档对 mwSize
的说明:
mwSize
(C和Fortran)尺寸值类型
描述
mwSize
是表示尺寸值(例如数组维度)的类型。使用此函数实现跨平台灵活性。默认情况下,在C中,mwSize
相当于int
。当使用mex -largeArrayDims
开关时,在C中,mwSize
相当于size_t
。在Fortran中,mwSize
类似地相当于基于平台和编译标志的INTEGER * 4
或INTEGER * 8
。
这是Wikipedia对 size_t
的说明:
size_t
是由多个 C/C++ 标准(例如 C99 ISO/IEC 9899 标准)定义的无符号数据类型,在stddef.h
中定义。[1] 它可以通过包含stdlib.h
来进一步导入此文件,因为该文件内部子包括了stddef.h
。[2]此类型用于表示对象的大小。接受或返回大小的库函数期望它们是此类型或具有
size_t
的返回类型。此外,最常使用的编译器操作符sizeof
应计算出与size_t
兼容的值。
size_t
的实际类型取决于平台,一个常见的错误是假设size_t
与unsigned int
相同,这可能会导致编程错误,[3][4]例如从32位转移到64位架构时。
就我所看到的,这些类型实际上是相同的。我的问题是:
- 它们是相同的吗?
- 如果它们是相同的,哪个会被认为是更好的编程风格?理想情况下,我们希望我们的代码也兼容未来的Matlab版本。我猜答案是
mwSize
,但我不确定。
编辑:我应该补充说,Matlab人员都在使用这两种类型。例如:
size_t mxGetN(const mxArray *pm);
mxGetN是一个函数,用于获取mxArray的列数。然而,当创建矩阵时,我们使用的是:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
显然输入应该是mwSize。
assert(sizeof(size_t) == sizeof(mwSize));
并使用其中任何一个。如果assert
失败,你就完蛋了。 - pmg-largeArrayDims
开关,而size_t
比int
更大的平台上将会导致断言失败。这就是使用mwSize
类型定义的整个目的所在。 - Praetorianassert
仅用作基本检查:我不了解mex的特定内容。 - pmg