2017-08-24 42 views
1

我正在为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::vectorsize_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_tint转换已经造成在不同的环境有些乱,我的问题是:

  • 我可以放心地忽略这个?
  • 实际上是否有任何人写这样的功能fieldNames()的原因(或者说,需要功能fieldName(int index)采取一个整数作为参数)?
  • 可能这个警告实际上指向我的配置文件中的错误?

回答

1

您可以放心地忽略这一点。

这就是为什么一个循环可能这样写 从http://en.cppreference.com/w/cpp/types/size_t一个很好的说明:

的std :: size_t会通常用于数组索引和循环计数。使用其他类型(如unsigned int)进行数组索引的程序可能会失败,例如,当索引超过UINT_MAX或者依赖于32位模块化算法时,它是64位系统。

size_t的实际值,即可分配的最大内存量,将取决于系统。编译器看起来会将0(在i = 0中)投射到int,然后抛出警告,因为它只是将可用范围减半(即代替unsigned int)。

但在实践中,i能可能仍指数高达2^32的值(这是它得到平台而定),而你是可能不会被处理具有许多字段名的结构。

可能这个警告实际上指向我的配置文件中的错误?

我不这么认为。

我可以放心地忽略这个吗?

是的。

+0

谢谢,这回答了我所有的主要问题。也感谢参考'size_t',因为我在很长时间后回到C++,所以我忘记了它的定义。 我只想知道,为什么MathWorks没有继续,并且定义'fieldName'采用'size_t'而不是'int'。但是可能有一些逻辑,只有在看看其中一个API是如何工作的时候才会显示出来('mxGetFieldNameByNumber'正在调用它,我假定它的定义是:'LIBMMWMATRIX_PUBLISHED_API_EXTERN_C const char * mxGetFieldNameByNumber')。 – niak

+0

您的欢迎和良好的后续行动。我想知道为什么当他们与其他的'std ::'名称空间引用一致时,他们没有将'size_t'引用为'std :: size_t'。这里可能有一些逻辑,或者它可能只是一个人造物,它有一个更大的代码库,在那里有人试图在表面看到他们所能够解决的问题,但留下的是太紧密的其他人,而且更容易可以这样说,让事情独自一人,关上厕所门。 – informaton