Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符的更好名称?_C++_C_Bit Manipulation - Fatal编程技术网

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
大小的一个可能很复杂的公式中,我将避免像瘟疫一样的文字数字。