【发布时间】:2011-09-28 22:21:39
【问题描述】:
我目前正在将一些用于 32 位 Matlab 的 C MEX 文件移植到 64 位 Matlab。
在这样做的过程中,我遇到了两种类型,一种来自Matlab的人,一种是C标准的。
这就是 Matlab 文档中关于 mwSize 的说法:
mwSize(C 和 Fortran)尺寸值的类型
说明
mwSize是一种表示大小值的类型,例如数组维度。使用此功能可实现跨平台灵活性。默认情况下,mwSize等价于 C 中的int。使用mex -largeArrayDims开关时,mwSize等价于 C 中的size_t。在 Fortran 中,mwSize类似地等价于INTEGER*4或@ 987654331@,基于平台和编译标志。
这就是维基百科所说的size_t:
size_t是由stddef.h中定义的多个 C/C++ 标准(例如 C99 ISO/IEC 9899 标准)定义的无符号数据类型。[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);
是一个检索 mxArray 的列数的函数。然而,当一个人创建一个矩阵时,一个人使用,
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
输入显然应该是 mwSize。
【问题讨论】:
-
嗯...作为基本检查,只需确保它们具有相同的大小:
assert(sizeof (size_t) == sizeof (mwSize));并使用其中任何一个。如果assert失败,你就完蛋了。 -
@pmg:如果在编译 mex 函数时不使用
-largeArrayDims开关,则断言将在size_t大于int的平台上失败。这就是拥有mwSizetypedef 的全部意义。 -
+1 感谢@Praetorian。正如我在评论中所说,
assert仅作为基本检查:我不知道墨西哥特定的东西。
标签: c matlab types 32bit-64bit mex