1

因此,在相当常规的基础上,我似乎发现我声明的某个常量的类型(通常是整数,但偶尔也有其他的东西,如字符串)在它正在使用的上下文中不是理想的类型,需要强制转换或导致编译器警告关于隐式演员表。

例如,在一段代码中,我有类似下面的内容,并且遇到了有符号/无符号比较问题。

static const int MAX_FOO = 16;

...

if (container.size() > MAX_FOO) {...}

我一直在考虑总是使用给定常量允许的最小/最基本类型(例如 char、unsigned char、const char* 等,而不是说 int、size_t 和 std::string),但想知道这是否真的一个好主意,如果在某些地方它可能是一个非常糟糕的主意?例如,使用'auto' 关键字(或者可能是模板)的代码获得了一个太小的类型并溢出了看起来是安全的操作?

4

1 回答 1

1

寻找可以保存初始值的最小类型是一个坏习惯。这会导致溢出。

总是为最一般的情况(根据墨菲定律是最坏的情况)编码。由于模板泛化了事物,这使得最坏的情况变得更糟。当无符号类型在附近时,请为奇怪的溢出做好准备,并避免负数。

std::size_t出于您提到的原因,对于任何东西的大小或长度来说,它都是最佳选择。但是减去指针,你会得到一个std::ptrdiff_t。我个人建议将这种减法的结果转换为std::size_t是否可以保证为正。

char *不像 C++ 意义上的那样拥有它的字符串std::string,所以后者是更保守的选择。

这个问题太笼统了,无法给出更具体的建议……</p>

于 2013-06-29T14:49:07.883 回答