【发布时间】:2022-01-02 01:33:48
【问题描述】:
至少从 C++11 开始,我们得到了可爱的固定宽度整数,例如在 C++ 的 <cstdint> 或 C 的 <stdint.h> 中开箱即用(例如 std::uint32_t、std::int8_t),所以有或没有std:: 在它们前面,甚至作为最小宽度的宏(INT16_C、UINT32_C 等等)。
然而,我们每天都在处理库,它们定义了它们自己的固定宽度整数,您可能已经看到例如sf::Int32、quint32、boost::uint32_t、Ogre::uint32、ImS32,...如果你愿意,我可以继续说下去。你可能也认识几个。
有时,这些 typedef(也经常是宏定义)可能会导致冲突,例如,当您想将 std 固定宽度整数传递给库中的函数时,该函数需要具有完全相同宽度但定义不同的固定宽度整数.
固定宽度整数的关键在于它们具有固定大小,正如您所知,这是我们在许多情况下所需要的。那么,为什么所有这些库的使用和 typedef 与我们在 C++ 标准中已有的整数完全相同呢?这些额外的定义有时会令人困惑、多余,并且可能会侵入您的代码库,这是非常糟糕的事情。如果他们没有他们承诺的宽度和签名,他们至少违反了最小惊讶的原则,那么我在此问你的意思是什么?
【问题讨论】:
-
如果您希望您的类型在乘法溢出时为
abort()怎么办?如果您想支持没有cstdint的系统怎么办?等等。附加功能和兼容性。 -
一个原因是 ADL 可以工作。 ADL 仅在类型和函数位于同一命名空间时才有效。
-
@NathanOliver:你能扩展非英语母语人士的 ADL 首字母缩写词吗?
-
@BasileStarynkevitch Argument-dependent lookup
标签: c++ integer fixed-width