为什么这么多库定义自己的固定宽度整数?

Why do so many libraries define their own fixed width integers?

至少从 C++11 开始,我们就有了可爱的固定宽度整数,例如在 C++ 的 <cstdint> 或 C 的 <stdint.h> 中开箱即用,(例如 std::uint32_tstd::int8_t),因此在它们前面有或没有 std::,甚至作为最小宽度的宏(INT16_CUINT32_C 等等)。

然而我们每天都在处理库,它们定义了自己的固定宽度整数,您可能已经看到例如 sf::Int32quint32boost::uint32_tOgre::uint32, ImS32, ... 如果你愿意,我可以继续说下去。你也可能认识几个。

有时这些 typedef(也通常是宏定义)可能会导致冲突,例如,当您想要将 std 固定宽度整数传递给库中的函数时,它期望具有完全相同宽度的固定宽度整数, 但定义不同。

固定宽度整数的要点是它们具有固定的大小,如您所知,这是我们在许多情况下所需要的。那么,为什么所有这些库都会使用我们在 C++ 标准中已经拥有的完全相同的整数来进行类型定义呢?这些额外的定义有时会令人困惑、多余,并且可能会侵入您的代码库,这是非常糟糕的事情。如果他们没有承诺的宽度和签名,他们至少违反了最小惊讶原则,所以我特此问你他们的意思是什么?

Why do so many libraries define their own fixed width integers?

可能出于以下某些原因:

  • 它们在 C++11 或 C11 之前开始(示例:GTK, Qt, libraries internal to GCC, Boost, FLTK, GTKmm, Jsoncpp, Eigen, Dlib, OpenCV, Wt

  • 他们希望在自己的 namespaceclass 中拥有可读代码(拥有自己的命名空间,就像 Qt 一样,可以提高编写良好的代码的可读性)。

  • 它们是构建时可配置的(例如 GNU autoconf)。

  • 他们希望可以使用旧的 C++ 编译器(例如某些 C++03 编译器)进行编译

  • 他们想成为 cross-compilable to cheap embedded microcontrollers 其编译器不是完整的 C++11 编译器。

  • 他们可能有通用代码(或 template-s,例如 Eigen or Dlib) to perhaps support arbitrary-precision arithmetic (or bignums) perhaps using GMPlib.

  • 他们希望通过 Frama-C or DO-178C 认证(对于嵌入式关键软件系统)

    以某种方式证明
  • 它们是特定于处理器的(例如 asmjit 在运行时在少数 架构上生成机器码)

  • 它们可能与特定硬件或编程语言接口 (Tensorflow, OpenCL, Cuda)。

  • 他们希望从 Python or GNU guile.

    开始可用
  • 它们可能是特定于操作系统的。

  • 他们添加了一些额外的运行时检查,例如反对除以 0(或其他未定义的行为)或溢出(C++ 标准不能要求,出于性能或历史原因)

  • 它们旨在轻松可用于机器生成的 C++代码(例如RefPerSys, ANTLR , ...)

  • 它们被设计为可从 C 代码调用(例如 libgccjit)。

  • 等...寻找其他好的理由作为练习留给 reader.