В настоящее время я работаю над переносом некоторых C MEX-файлов для 32-битного Matlab на 64-битный Matlab.
При этом я сталкивался с двумя типами: один из людей Matlab, а другой - стандарт C.
Это то, что говорится в документации Matlab mwSize
:
mwSize
(C и Fortran)
Тип для значений размера
Описание
mwSize
- это тип, который представляет значения размера, такие как размеры массива. Используйте эту функцию для кроссплатформенной гибкости. По умолчанию mwSize
эквивалентно int
в C. При использовании переключателя mex -largeArrayDims
, mwSize
эквивалентно size_t
в C. В Fortran mwSize
аналогично эквивалентно INTEGER*4
или INTEGER*8
, на основе платформы и флагов компиляции.
Вот что говорит Википедия о 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);
- это функция, которая получает количество столбцов mxArray. Однако, когда кто-то создает матрицу, он использует
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
где ввод, очевидно, должен быть mwSize.