【问题标题】:C++ Picking a type for a constantC++ 选择常量的类型
【发布时间】:2013-06-27 04:33:45
【问题描述】:

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

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

static const int MAX_FOO = 16;

...

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

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

【问题讨论】:

  • 大小通常是未签名的,这就是为什么同时存在未签名的size_t 和签名的ssize_t
  • 对于容器大小,我酌情使用autoContainerType::size_type

标签: c++ coding-style


【解决方案1】:

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

始终为最一般的情况(根据墨菲定律是最坏的情况)编码。当模板概括事物时,这会使最坏的情况变得更糟。为奇怪的溢出做好准备,避免在无符号类型附近出现负数。

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

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

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

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多