我正在为Matlab编写mex函数,并在编译期间注意到Visual Studio 2017中的警告。之后几乎消除一切,但包括和MEX-功能的裸包装,我不得不得出这样的警告是真的指向库本身的结论:Matlab/Mex:mxarray.h中的转换警告
#include <mexplus/mxarray.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
}
这个片段已经触发了警报
...\mexplus\mxarray.h(737): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data
我看着文件而事实上,也就是通过std::vector
在size_t
一个循环迭代,同时调用先前定义的函数,即服用int
作为参数:
733: std::vector<std::string> fieldNames() const {
734: MEXPLUS_ASSERT(isStruct(), "Expected a struct array.");
735: std::vector<std::string> fields(fieldSize());
736: for (size_t i = 0; i < fields.size(); ++i)
737: fields[i] = fieldName(i);
738: return fields;
739: }
功能fieldName
是上文所限定:
std::string fieldName(int index) const {
const char* field = mxGetFieldNameByNumber(array_, index);
MEXPLUS_ASSERT(field, "Failed to get field name at %d.", index);
return std::string(field);
}
因此,自size_t
到int
转换已经造成在不同的环境有些乱,我的问题是:
- 我可以放心地忽略这个?
- 实际上是否有任何人写这样的功能
fieldNames()
的原因(或者说,需要功能fieldName(int index)
采取一个整数作为参数)? - 可能这个警告实际上指向我的配置文件中的错误?
谢谢,这回答了我所有的主要问题。也感谢参考'size_t',因为我在很长时间后回到C++,所以我忘记了它的定义。 我只想知道,为什么MathWorks没有继续,并且定义'fieldName'采用'size_t'而不是'int'。但是可能有一些逻辑,只有在看看其中一个API是如何工作的时候才会显示出来('mxGetFieldNameByNumber'正在调用它,我假定它的定义是:'LIBMMWMATRIX_PUBLISHED_API_EXTERN_C const char * mxGetFieldNameByNumber')。 – niak
您的欢迎和良好的后续行动。我想知道为什么当他们与其他的'std ::'名称空间引用一致时,他们没有将'size_t'引用为'std :: size_t'。这里可能有一些逻辑,或者它可能只是一个人造物,它有一个更大的代码库,在那里有人试图在表面看到他们所能够解决的问题,但留下的是太紧密的其他人,而且更容易可以这样说,让事情独自一人,关上厕所门。 – informaton