C++ 字符的更好名称?
我刚刚意识到,C++ 字符的更好名称?,c++,c,bit-manipulation,C++,C,Bit Manipulation,我刚刚意识到,CHAR\u BIT并不像我所期望的那样由标题定义,甚至在较新的GCC上也不是由\include定义的 我真的必须包含字符才能获得字符的“功能”吗?定义“更新的”。随机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 ~>g
CHAR\u BIT
并不像我所期望的那样由标题定义,甚至在较新的GCC上也不是由\include
定义的
我真的必须包含字符才能获得字符的“功能”吗?定义“更新的”。随机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
~>gcc--版本
通用条款(gcc)4.1.2(Gentoo 4.1.2)
[剪报]
~>grep CHAR\u位/usr/include/*.h
/usr/include/limits.h:#定义字符位8
这不符合条件吗?在C中,我认为应该包括
限制.h
来获得字符位是的,你应该包括来获得字符位的定义。对于您的程序来说,这根本不是一个瓶颈(请参阅下面的评论),稍后您可能会发现自己正在移植到不同的平台。并不是每个实现都具有<代码> 8 <代码> < /p> < p> <代码> <代码>,是C++标准要求的字符位。即使您碰巧在
中找到了它,也不能保证它在那里,因此最好直接找到源代码。您可能知道,包含
并不是有什么问题,实现是否要包含其他头是未指定的。这是允许的,但不是强制的。(§17.4.4.1)因此,您必须明确或了解您的担保
<>只有一个C++头必须包含另一个,如果它需要另一个定义。例如,
要求包含
标准尺寸的
,因为这在标准中有明确规定。(§23.3.5,本例中)
作为反例,考虑<代码> <代码>。它可能包括
,并根据其中的宏定义数值限制的值,通常是这样,因为这对于实现来说是最容易的。但所有的标准都是这样说的:“相当于CHAR\u-MIN
,SHRT\u-MIN
,FLT\u-MIN
,DBL\u-MIN
,等等。”但并没有说它必须按照这些标准来实现,这意味着
不必包含在内
因此,确保定义字符位的唯一方法是包含
或其他明确说明必须包含它的头。据我所知,没有人需要;例如,一个实现可以在任何需要的地方对值进行硬编码,或者包括
并使用std::numeric\u limits::digits
(这是等效的)。我在.profile中保留以下函数来检查编译器定义的常量。在我的系统中,\uuuu CHAR\u BIT\uuu
在其中,这意味着如果您可以使用双下划线表单,则不需要任何标题,而双下划线表单可能仅适用于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
}
除非您是为DSP编程,否则更好的名称是8
。POSIX和Windows都需要CHAR\u BIT==8
,这几乎涵盖了除DSP之外的所有有趣的目标。(我不认为70年代的大型机是一个潜在的有趣的目标了,但也许有人会提出不同意见…)< /P>什么是问题,包括代码>气候> <代码>还是<代码>限制?h < /代码>?这似乎是一个很大的麻烦(和潜在的编译时间),以避免写入神奇数字8。您是否要求以不同的方式获取字符所代表的信息?这比我最初的阅读更有意义。试着测量一下包含和不包含的区别,我敢打赌你不会注意到任何区别。请记住,那些愿意牺牲正确性而忽略性能的人都不值得。我们谈论的是编译时间,甚至不是运行时。@Dennis:是的,不过如果另一个常用的头包含
,我会很高兴。这对您的程序来说根本不是瓶颈,因为它是一个几乎总是扩展为常量的宏。所有的“工作”都发生在编译时。是的,我知道这一点。现在修正了措辞。谢谢。你甚至回答了标题中的问题,并为它提供了一个更好的名字!主要是不重要的琐事:请注意,仅包含C++的其他标准头的实现。在C语言中,如果包含限制.h
,编译器实现只允许定义字符位。事实上,如果用户没有包括limits.h
,那么用户自己定义CHAR\u BIT
供自己使用是完全可以的(根据C标准),只有在包含limits.h
时,该标识符才被保留。我并不认为这是一个好主意,但就C标准而言,这是可以接受的。重要的琐事:numeric\u limits::digits
仅当CHAR
无符号时,才等同于CHAR\u BIT
。如果char
是有符号的,那么它相当于(char\u BIT-1)
,因为digits
成员不计算符号位。我只想继续,包括你想要的号码。@GMan:我只想特别提醒你,你必须小心使用无符号字符,而不仅仅是字符。
@Michael:啊,明白了。:)你也可以做数字限制::数字+数字限制::是有符号的
,但是meh。因此,你有一个特定于平台的解决方法,以避免包含一个标题,而这个标题只是为了避免在一开始就对平台做出假设才需要的?它回答了这个问题。gcc是一个平台吗?这是一个真正的问题,但在计算std::bitset
大小的一个可能很复杂的公式中,我将避免像瘟疫一样的文字数字。