私は未知のtypedef'd数値型を持っています。可能であればsize_t
にキャストしたいと思っています(size_t
の範囲内であれば読んでください)。さもなければ、エラー処理コードに落ちます。型typedefの数値型をsize_tにキャストすることは、オーバーフローのキャッチオーバー
ポータブルな方法はありますか?効果的
私は何をしたいのは、次のとおりです。
some_int_type val = <blah>;
if (val < 0 || val > SIZE_MAX) {
// handle error
} else {
return (size_t) val;
}
valが署名することができるようしかし、これは、動作しません。
私の第二の考えはこれを行うには、次のようになります。
if (val < 0 || (unsigned_some_int_type) val > SIZE_MAX) {
// handle error
} else {
return (size_t) val;
}
これは、(私が思うに)働くだろう - 私はsome_int_type
の符号なしのバージョンを持っていないことを除いて。 some_int_type
がsize_t
より小さい場合は正しく動作しないことを除いて、私はそれらを両方ともsome_int_type
にキャストすることができます(some_int_type
が署名されていれば正しく動作しません)。私はそれらを両方ともuintmax_t
にキャストすることができましたが、一部のコンパイラでは実際にuintmax_t
より大きい整数型があります。 (特に、__[u]int128
)。
どうすればこのようにすることができますか?負のケースを確認した後、正
if (val >= 0)
{
if (val <= SIZE_MAX)
{
return (size_t) val;
}
}
// Handle error
return 0;
なぜ最初のバージョンが機能しないと思いますか? – Olaf
タイプはどのように「不明」ですか? @EugeneSh。 –
コンパイル時にビルドされた外部ライブラリにあるとき。 – TLW