更好的CHAR_BIT名称?

Pot*_*ter 16 c c++ bit-manipulation

我只是在检查一个答案,并意识到这CHAR_BIT不是由我期望的标题定义的,甚至不是#include <bitset>在新的GCC上.

我真的#include <climits>只需要获得"功能" CHAR_BIT吗?

GMa*_*ckG 24

您可能知道,实现是否要包含其他标头是未指定的.这是允许的,但不是强制性的.(§17.4.4.1)因此,您必须明确或了解您的保证.

C++标头必须包含另一个标头的唯一情况是它是否需要另一个标识符.例如,<bitset>需要包括<cstddef>用于std::size_t,因为这是明确的标准说明.(对于这个例子,§23.3.5)

对于反例,请考虑<limits>.它可以包含<climits>和定义numeric_limits内部宏的值,并且经常这样做,因为这对于实现来说是最容易的.但是,所有的标准说是这类话:" 等同CHAR_MIN,SHRT_MIN,FLT_MIN,DBL_MIN,等等." 但并没有说它必须以那些方式实施,这意味着<climits>不必包括在内.

因此,唯一可以保证CHAR_BIT定义a的方法是通过包含<climits>或明确声明必须包含它的其他标题.据我所知,没有必要; 一个实现可以自由地在任何需要的地方对代码进行硬编码,例如,包含<limits>和使用std::numeric_limits<unsigned char>::digits(这是等效的).

  • 重要的琐事:`numeric_limits <char> :: digits`仅当`char`是无符号时才等同于`CHAR_BIT`.如果`char`被签名,那么它相当于`(CHAR_BIT - 1)`,因为`digits`成员不计算符号位.我只是继续`#include <limits.h>`得到你想要的数字. (7认同)
  • 你甚至在标题中回答了这个问题,并提供了一个更好的名字! (3认同)
  • 大多数不重要的琐事:请注意,仅允许C++实现包含其他标准头的实现.在C中,如果包含`limits.h`,则只允许编译器实现定义`CHAR_BIT`.实际上,如果用户没有包含`limits.h`,那么用户自己定义`CHAR_BIT`就完全可以(通过C标准) - 只有`limits.h才能保留标识符. `包括在内.并不是说我提倡这是一个好主意,但就C标准而言,它是可以的. (3认同)

R..*_*R.. 8

除非你是为DSP编程,否则更好的名字就是8.POSIX和Windows都需要CHAR_BIT==8,除了DSP之外,几乎涵盖了所有有趣的目标.(我不会再考虑20世纪70年代的大型机可能是一个有趣的目标,但也许有人会乞求不同......)

  • 真的没用,但在计算 `std::bitset` 大小的一个可能复杂的公式中,我将避免像瘟疫一样使用文字数字。 (2认同)

Den*_*ose 6

<climits>是C++标准要求CHAR_BIT的地方.即使你碰巧发现它<bitset>,它也不能保证在那里,所以你最好直接去源头.它不像是包含了什么问题<climits>.