为什么库的C头文件中的常量始终定义为十六进制?

Byz*_*ian 6 convention hex constants

无论我使用哪个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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*tts 6

有许多可能的原因:

1)位标志更容易表示为十六进制,因为每个十六进制数字恰好代表4位.

2)即使对于非明确位标志的值,通常有意的位模式在写为十六进制时更明显.

例如,所有AlphaFunction都以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
Run Code Online (Sandbox Code Playgroud)

3)允许十六进制值具有前导零,因此更容易排列值.这可以使阅读(和校对)更容易.您可能会感到惊讶的是,在十六进制和八进制文字中允许前导零而不是十进制,但C++规范明确说明

十进制整数文字(十进制)以0以外的数字开头,由一系列十进制数字组成.