这是一个非常小的问题,所以如果它太宽泛或可能重复,我表示道歉.我搜索并发现了几个关于隐式整数转换如何工作的问题,但没有人质疑它是否是一件好事.我根本不关心这一点,但是编译器给出隐含转换的所有响亮和恼人的警告让我想知道这是否被认为是一个问题.
举一个简单的例子,这里是一个片段调用一个函数,它接受一个链表,一个整数(索引)和一个无符号整数(范围),它从链表中删除指定的范围.
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);
Run Code Online (Sandbox Code Playgroud)
死简单; 不是非常有趣.但clang抱怨传递给函数的值会缩短,在第二种情况下会改变符号.假设我知道(就像我在这里做的那样)不存在溢出问题,并且值总是正的,这实际上是一个问题吗?是否应该明确表示这样?
ll_delete_range_at(baz->ll, (int)(first+1), (unsigned)(diff-1));
Run Code Online (Sandbox Code Playgroud)
据我了解,除了添加杂乱并明确声明程序员知道正在完成转换并且确信它们没问题之外,这只会改变.这值得杂乱吗?
频繁铸造的混乱是架构不好的标志,而不是明确铸造错误的迹象.
如果您知道特定变量或成员将始终处于特定范围或大小,则从头开始使用适当的类型声明它们.
如果必须使用特定范围或大小声明必须使用的类型,那么这有一个原因,并且无论您在何处使用它们,该原因都是有效的,因此请坚持使用整个代码中的类型.
如果你有一个必须强制转换的特殊情况(例如,在组合两个使用不同类型的库时),那么将该转换封装在辅助函数或包装类中并进行适当的错误处理.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |