更好的CHAR_BIT名称?

时间:2010-04-22 06:59:18

标签: c++ c bit-manipulation

我只是checking an answer并且意识到CHAR_BIT并非由我期望的标题定义,即使#include <bitset>也没有在新的GCC上定义。

我是否真的必须#include <climits>才能获得CHAR_BIT的“功能”?

6 个答案:

答案 0 :(得分:24)

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

C ++标头必须包含另一个标头的唯一时间是它是否需要另一个定义。例如,<bitset>需要包含<cstddef> std::size_t,因为标准中明确说明了这一点。 (对于这个例子,§23.3.5)

对于反例,请考虑<limits>可能包含<climits>并根据其中的宏定义numeric_limits的值,并且它通常会执行,因为这对于实现来说是最简单的。但所有标准都是这样的:“等效CHAR_MINSHRT_MINFLT_MINDBL_MIN等。”但并没有说必须以这些方式实施,这意味着<climits>不必包括在内。

因此,保证定义CHAR_BIT的唯一方法是通过包含<climits>或其他一些明确声明必须包含它的标头。据我所知,没有必要;例如,一个实现可以随意对所需值进行硬编码,或者包括<limits>并使用std::numeric_limits<unsigned char>::digits(这是等效的)。

答案 1 :(得分:8)

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

答案 2 :(得分:6)

<climits>是C ++标准要求CHAR_BIT的地方。即使你碰巧在<bitset>找到它,也不能保证在那里,所以你最好直接去源头。它不像包括<climits>

那样有问题

答案 3 :(得分:3)

定义“更新”。一个随机的Linux系统给了我这些结果:

~> gcc --version
gcc (GCC) 4.1.2 (Gentoo 4.1.2)
[snip]

~> grep CHAR_BIT /usr/include/*.h
/usr/include/limits.h:#  define CHAR_BIT        8

这不合格吗?在C中,我认为should always be enough包含limits.h来获取CHAR_BIT

答案 4 :(得分:0)

是的,您应#include <limits.h>获取CHAR_BIT的定义。它对你的程序来说根本不是瓶颈(见下面的评论),后来你可能会发现自己移植到不同的平台。并非每个实现都具有8

的值

答案 5 :(得分:0)

我在.profile中保留以下函数来检查编译器定义的常量。在我的系统__CHAR_BIT__就在那里,这意味着如果你可以使用双下划线形式,那么不需要标题,这可能只适用于gcc。

defines () 
{ 
    touch /tmp/defines.h;
    cpp -dD "$@" /tmp/defines.h | awk '$1!="#"{COUNT+=1;print;}END{printf("count %d\n",COUNT);}' | sort;
    rm /tmp/defines.h
}
相关问题