我只是checking an answer并且意识到CHAR_BIT
并非由我期望的标题定义,即使#include <bitset>
也没有在新的GCC上定义。
我是否真的必须#include <climits>
才能获得CHAR_BIT
的“功能”?
答案 0 :(得分: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
的唯一方法是通过包含<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
}