簡體   English   中英

size_t到unsigned int(來自API函數)

[英]size_t to unsigned int (from API function)

我使用Oracle API訪問數據庫,這個API有一個函數readBuffer(char * buffer, unsigned int size); 我不能做任何改變。

我有一個使用這個API的類,我的函數的簽名當前采用std::stringunsigned 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可能大於( unsignedint ,因此如果是這種情況你就無法安全轉換。

例如,可以想象int是32位,而size_t是64位。 我不知道這樣的系統/配置,但它可能會發生。

對於大多數“合理”系統,兩者都至少為32位,並且仍然(可能)不會發生單個4 GB字符串。

所以那么你可以只是施放,這將是有效的,但它對所有可能的系統和角落情況都不是“安全的”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM