2017-08-24 45 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