参考这个指南:
https://google.github.io/styleguide/cppguide.html#Integer_Types
Google建议在大部分情况下使用int
。
我尝试遵循这个指南,唯一的问题是使用STL容器。
例子 1。
void setElement(int index, int value)
{
if (index > someExternalVector.size()) return;
...
}
比较 index
和 .size()
会生成警告。
示例 2。
for (int i = 0; i < someExternalVector.size(); ++i)
{
...
}
i
和 .size()
之间出现相似的警告。
如果我将 index
或者 i
声明为 unsigned int
,那么警告会消失,但是类型声明会传播,因此我必须将更多变量声明为 unsigned int
,这与指南相矛盾且不一致。
我所能想到的最好方法是使用强制类型转换,例如:
if (index > static_cast<int>(someExternalVector.size())
或者
for (int i = 0; i < static_cast<int>(someExternalVector.size()); ++i)
但我真的不喜欢强制类型转换。
有什么建议吗?
以下是一些详细思考:
将所有整数都声明为有符号整数的优点在于:可以避免 signed/unsigned 的警告、强制类型转换,并确保每个值都可以是负数(保持一致),因此 -1 可以用来表示无效值。
有许多情况下,循环计数器的使用与某些其他常量或结构成员混合在一起。如果 signed/unsigned 不一致,那么这将是有问题的。这将充满警告和强制类型转换。
auto
和decltype
肯定会对此有所帮助。您还应该阅读 Herb Sutter 的这篇文章。 - Mark Garciaint
与其大小相同或更大的unsigned
类型交互方面存在一些怪异之处... - Yakk - Adam Nevraumontauto
。这个特性从GCC 4.4/Clang 2.9(!)/MSVC 2010开始支持。 - rubenvb