【发布时间】:2013-06-19 03:48:27
【问题描述】:
参考本指南:
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)
但我真的不喜欢演员表。
有什么建议吗?
下面有一些详细的想法:
仅使用有符号整数的好处是:我可以避免有符号/无符号警告、强制转换,并确保每个值都可以是负数(保持一致),因此 -1 可用于表示无效值。
在很多情况下,循环计数器的使用与其他一些常量或结构成员混合使用。因此,如果有符号/无符号不一致,就会有问题。将充满警告和强制。
【问题讨论】:
-
C++11 的
auto和decltype肯定会对此有所帮助。您还应该阅读 Herb Sutter 的 this 文章。 -
谢谢。但是 C++11 现在可能不是我的解决方案……我们的项目不能支持 :(
-
你的编译器是什么? C++ 本身并不规定警告。顺便说一句,您是否尝试过使用 64 位或更大的整数类型?关于
int如何与unsigned大小和更大的类型交互存在一些怪癖...... -
我使用 Visual Studio 2008 作为编译器。
-
你有什么理由要遵循那个所谓的“指南”吗?
标签: c++ stl casting integer warnings