如果我正在使用一个当前使用特定数字类型别名的库,例如:
我可以加入以下检查:
第二次检查将确保我得到的值符合当前
第一个检查可以捕获如果
C语言是否提供了一种操作符来内省类型的有符号性,就像
typedef uint32_t library_type;
void library_function(library_type x);
如果代码需要传递不同类型的值,我该如何确保即使库更改了typedef,它仍然正确无误?
uint64_t x = get_some_number();
// …need checks here…
library_function((library_type)x);
我可以加入以下检查:
• 检查:
assert(sizeof library_type >= sizeof uint32_t);
assert(x <= UINT32_MAX);
第二次检查将确保我得到的值符合当前
library_type
的范围。库的作者没有提供LIBRARY_TYPE_MAX
定义,因此第一个检查试图在未来编译代码时防止library_type
发生更改。第一个检查可以捕获如果
library_type
被更改为例如int8_t
,但是如果library_type
被更改为int32_t
呢?它仍然是正确的“大小”,但范围仍然小于我正在检查的范围!C语言是否提供了一种操作符来内省类型的有符号性,就像
sizeof
让我知道宽度一样?还有其他方法来确保我对library_type
的转换只有在正确的情况下才会被执行吗?
std::is_signed
; 我在想C语言中是否有类似的东西(以及这是否是正确的方法;-) - natevw-Wconversion
捕获错误的隐式转换呢?得到类似这样的提示:conversion to uint32_t {aka unsigned int} from int32_t {aka int} may change the sign of the result
。 - kaylumuint32_t x_cast = (uint32_t) x; library_function(x_cast);
- kaylum