我正在爲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