【发布时间】:2016-07-05 16:29:55
【问题描述】:
我有一个未知的 typedef 数字类型。如果可能的话,我想将其转换为 size_t(阅读:如果它在 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,但如果some_int_type 小于size_t,那将无法正常工作(如果some_int_type 已签名,则也无法正常工作,现在我考虑了一下) .我可以将它们都转换为uintmax_t - 除了一些编译器实际上具有大于uintmax_t 的整数类型。 (值得注意的是,__[u]int128)。
那我该怎么做呢?
【问题讨论】:
-
为什么第一版不行?
-
一个类型怎么可能是“未知的”?
-
@EugeneSh。当它位于编译时构建的外部库中时。
-
我自己对此并不熟悉,但这对我来说似乎是
的情况。 -
@TLW 如果编译器知道 - 它是已知的。