首页 > 解决方案 > 整数类型应该显式转换(例如,将“int”转换为“unsigned”)还是只会增加混乱?

问题描述

这是一个很小的问题,所以如果它太宽泛或可能重复,我深表歉意。我搜索并发现了几个关于隐式整数转换如何工作的问题,但没有人问这是否是一件好事。我通常根本不会关心这一点,但是编译器给出的关于隐式转换的所有响亮和恼人的警告让我想知道这是否被认为是一个问题。

作为一个简单的例子,这里是一个调用函数的片段,该函数接受一个链表、一个整数(索引)和一个无符号整数(范围),它从链表中删除指定的范围。

const int64_t first = foo;
const int64_t last  = bar;
const int     diff  = last - first; /* int for example's sake */
/* ... */
ll_delete_range_at(baz->ll, first+1, diff-1);

死简单;不是很有趣。但是 clang 抱怨传递给函数的值被缩短了,在第二种情况下,符号被改变了。假设我知道(就像我在这里所做的那样)不会出现溢出问题,并且这些值始终为正,这真的是一个问题吗?应该像这样明确地转换吗?

ll_delete_range_at(baz->ll, (int)(first+1), (unsigned)(diff-1));

据我了解,这只会增加混乱并明确声明程序员知道正在完成的转换并确信它们是好的。这值得混乱吗?

标签: c++c

解决方案


频繁转换造成的混乱是不良架构的标志,而不是显式转换错误的迹象。

  1. 如果您知道特定变量或成员将始终处于特定范围或大小中,则从一开始就使用适当的类型声明它们。

  2. 如果您必须使用的类型需要以特定的范围或大小声明,那么这是有原因的,并且无论您在何处使用它们,该原因都是有效的,因此请在整个代码中坚持使用这些类型。

  3. 如果您有必须强制转换的特殊情况(例如,当组合使用不同类型的两个库时),则将该强制转换封装在辅助函数或包装类中,并进行适当的错误处理。


推荐阅读