为什么库的C头文件中的常量总是被定义为十六进制? [英] Why are constants in C-header files of libraries always defined as hexadecimal?

查看:284
本文介绍了为什么库的C头文件中的常量总是被定义为十六进制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

无论我使用哪个C兼容库,当我查看标头定义的常量时,它们总是被定义为十六进制值。例如,在GL / gl.h中:

  #define GL_POINTS 0x0000 
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
#define GL_POLYGON 0x0009

这个约定有什么特别的原因,为什么不简单地使用十进制值?

解决方案

有很多可能的原因:

<1>位标志更容易表达为十六进制,因为每个十六进制数字代表正好4位。

<2>即使对于不是显式位标志的值,通常有意图的位模式在以十六进制写时更明显。


实例中,所有的AlphaFunctions都以0x02开始,并且只有一个字节不同:

  #define GL_NEVER 0x0200 
#define GL_LESS 0x0201
#define GL_EQUAL 0x0202
#define GL_LEQUAL 0x0203
#define GL_GREATER 0x0204
#define GL_NOTEQUAL 0x0205
#define GL_GEQUAL 0x0206
#define GL_ALWAYS 0x0207

3)十六进制值允许有前导零,因此排列值更容易。这可以使阅读(和校对)变得更容易。您可能会感到惊讶,前导零可以使用十六进制和八进制文字,但不能使用十进制,但 C ++规范相当明确地表示

lockquote

十进制整数字面值(以十为底)以0以外的数字开头,由一个十进制数字序列。



No matter which C-compatible library I use, when I look at the header defined constants, they are always defined as hexadecimal values. Here, for instance, in GL/gl.h:

#define GL_POINTS                               0x0000
#define GL_LINES                                0x0001
#define GL_LINE_LOOP                            0x0002
#define GL_LINE_STRIP                           0x0003
#define GL_TRIANGLES                            0x0004
#define GL_TRIANGLE_STRIP                       0x0005
#define GL_TRIANGLE_FAN                         0x0006
#define GL_QUADS                                0x0007
#define GL_QUAD_STRIP                           0x0008
#define GL_POLYGON                              0x0009

Is there any particular reason for this convention, why not simply use decimal values instead?

解决方案

There are a number of possible reasons:

1) Bit flags are much easier to express as hex, since each hex digit represents exactly 4 bits.

2) Even for values which aren't explicitly bit flags, there are often intentional bit patterns that are more evident when written as hex.

For instance, all the AlphaFunctions start with 0x02 and differ in only a single byte:

#define GL_NEVER                          0x0200
#define GL_LESS                           0x0201
#define GL_EQUAL                          0x0202
#define GL_LEQUAL                         0x0203
#define GL_GREATER                        0x0204
#define GL_NOTEQUAL                       0x0205
#define GL_GEQUAL                         0x0206
#define GL_ALWAYS                         0x0207

3) Hex values are allowed to have leading zeroes, so it is easier to line up the values. This can make reading (and proof-reading) easier. You might be surprised that leading zeroes are allowed in hex and octal literals but not decimal, but the C++ spec says quite explicitly

A decimal integer literal (base ten) begins with a digit other than 0 and consists of a sequence of decimal digits.

这篇关于为什么库的C头文件中的常量总是被定义为十六进制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆