开发者

size_t to unsigned int (from API function)

I am using the Oracle API to access a database and this API has a function readBuffer(char * buffer, unsigned int size); to which I cannot make any changes.

I have a class that uses this API and the signature of my function currently takes a std::string and an unsigned int for the size, the problem is that when I pass std::string.size() to the size argument of my function, I get a warning from my compiler that convertin开发者_Python百科g from size_t to unsigned int could cause data loss.

I wondered if there is a valid way to convert the size_t to an unsigned int so I can pass it to my API and not get a warning from the compiler?

I understand the purpose of size_t and searching google for this conversion turns up a lot of results that say "change the function to take a size_t arg" but I CANNOT change the signature of my API in this case.

Any suggestions?


Yes, write a helper function that will check whether such conversion is valid and throw an exception otherwise. Something like:

unsigned int convert( size_t what )
{
    if( what > UINT_MAX ) {
       throw SomeReasonableException();
    }
    return static_cast<unsigned int>( what );
}


Well, do a static_cast<unsigned int>(mystring.size()).

The reason is that std::size_t is usually pointer-size, but there are 64 bit platforms on which an int is still 32 bits. In this case, the only reason for data loss would be if the string in question had a length of more than 2^32 bytes.

If you know that this won't happen, put an assert somewhere to catch this case and static_cast the compiler to silence.


static_cast<unsigned int>(str.size());

If you want to be paranoid:

if (static_cast<unsigned int>(str.size()) != str.size()) 
  throw ...


You can force the conversion using the

static_cast<unsigned int>(your_variable)

construct. Of course the correct way would be for the API to accept size_t...


The risk here is that size_t might be larger than (unsigned) int, and thus you cannot safely convert if that is the case.

For instance, it's conceivable that int is 32 bits, while size_t is 64 bits. I don't know such a system/configuration off the top of my head, but it could occur.

For most "reasonable" systems, both will be at least 32 bits, and a single 4 GB string is still (perhaps) unlikely to occur.

So then you could just cast, that would be valid but it would not be "safe" for all possible systems and corner cases.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜