繁体   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