[英]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.