[英]size_t to unsigned int (from API function)
我使用Oracle API訪問數據庫,這個API有一個函數readBuffer(char * buffer, unsigned int size);
我不能做任何改變。
我有一個使用這個API的類,我的函數的簽名當前采用std::string
和unsigned int
作為大小,問題是當我將std::string.size()
傳遞給我的size參數時函數,我收到編譯器的警告,從size_t
轉換為unsigned int
可能會導致數據丟失。
我想知道是否有一種有效的方法將size_t
轉換為unsigned int
所以我可以將它傳遞給我的API而不是從編譯器得到警告?
我理解為size_t的目的和谷歌搜索此轉換變成了很多結果說:“改變采取的size_t ARG功能”,但我不能改變我的API的簽名在這種情況下。
有什么建議?
是的,編寫一個輔助函數來檢查這種轉換是否有效,否則拋出異常。 就像是:
unsigned int convert( size_t what )
{
if( what > UINT_MAX ) {
throw SomeReasonableException();
}
return static_cast<unsigned int>( what );
}
好吧,做一個static_cast<unsigned int>(mystring.size())
。
原因是std::size_t
通常是指針大小,但是有64位平台, int
仍然是32位。 在這種情況下,數據丟失的唯一原因是所討論的字符串長度超過2 ^ 32字節。
如果你知道不會發生這種情況,可以在某個地方放置一個assert
以捕獲這種情況,並將編譯器static_cast
靜音。
static_cast<unsigned int>(str.size());
如果你想成為偏執狂:
if (static_cast<unsigned int>(str.size()) != str.size())
throw ...
您可以使用強制轉換
static_cast<unsigned int>(your_variable)
構造。 當然,正確的方法是API接受size_t
...
這里的風險是size_t
可能大於( unsigned
) int
,因此如果是這種情況你就無法安全轉換。
例如,可以想象int
是32位,而size_t
是64位。 我不知道這樣的系統/配置,但它可能會發生。
對於大多數“合理”系統,兩者都至少為32位,並且仍然(可能)不會發生單個4 GB字符串。
所以那么你可以只是施放,這將是有效的,但它對所有可能的系統和角落情況都不是“安全的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.