Matlab/Mex:mxarray.h 中的转换警告
Matlab/Mex: Conversion warning in mxarray.h
我正在为 Matlab 编写一个 mex 函数,并在编译期间注意到来自 Visual Studio 2017 的警告。在几乎擦除除包含的所有内容和 mex 函数的裸包装器之后,我不得不得出结论,警告实际上指向库本身:
#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
我查看了文件,确实有一个循环在 size_t
中通过 std::vector
进行迭代,同时调用先前定义的函数,该函数将 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)
以整数作为参数)?
- 这个警告实际上可能指向我的配置文件中的错误吗?
您可以放心地忽略它。
这里很好地描述了为什么循环可以这样写
来自 http://en.cppreference.com/w/cpp/types/size_t:
std::size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int, for array indexing may fail on, e.g. 64-bit systems when the index exceeds UINT_MAX or if it relies on 32-bit modular arithmetic.
size_t
的实际值,可分配的最大内存量,将取决于系统。编译器看起来将 0(在 i = 0
中)转换为 int
,然后抛出警告,因为它只是将可用范围减少了一半(即而不是 unsigned int
)。
但在实践中,i
可能仍然可以索引到 2^32 的值(这是它依赖于平台的地方),而你 可能 不会处理具有那么多字段名称的结构。
Might this warning actually point to an error in my configuration file?
我不这么认为。
Can I safely ignore this?
是的。
我正在为 Matlab 编写一个 mex 函数,并在编译期间注意到来自 Visual Studio 2017 的警告。在几乎擦除除包含的所有内容和 mex 函数的裸包装器之后,我不得不得出结论,警告实际上指向库本身:
#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
我查看了文件,确实有一个循环在 size_t
中通过 std::vector
进行迭代,同时调用先前定义的函数,该函数将 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)
以整数作为参数)? - 这个警告实际上可能指向我的配置文件中的错误吗?
您可以放心地忽略它。
这里很好地描述了为什么循环可以这样写 来自 http://en.cppreference.com/w/cpp/types/size_t:
std::size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int, for array indexing may fail on, e.g. 64-bit systems when the index exceeds UINT_MAX or if it relies on 32-bit modular arithmetic.
size_t
的实际值,可分配的最大内存量,将取决于系统。编译器看起来将 0(在 i = 0
中)转换为 int
,然后抛出警告,因为它只是将可用范围减少了一半(即而不是 unsigned int
)。
但在实践中,i
可能仍然可以索引到 2^32 的值(这是它依赖于平台的地方),而你 可能 不会处理具有那么多字段名称的结构。
Might this warning actually point to an error in my configuration file?
我不这么认为。
Can I safely ignore this?
是的。