C++为常量选择类型

C++ Picking a type for a constant

本文关键字:类型 选择 常量 C++      更新时间:2023-10-16

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

例如,在一段代码中,我遇到了下面这样的问题,并遇到了一个有符号/无符号的比较问题。

static const int MAX_FOO = 16;
...
if (container.size() > MAX_FOO) {...}

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

选择能够保存初始值的最小类型是一个坏习惯。这会导致溢出。

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

出于你提到的原因,std::size_t是任何东西的尺寸或长度的最佳选择。但是减去指针,得到的是std::ptrdiff_t。就我个人而言,如果可以保证是正的,我建议将这种减法的结果转换为std::size_t

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

这个问题太宽泛了,无法提出更具体的建议…