constants - 为什么库的 C 头文件中的常量总是定义为十六进制?

标签 constants convention hex

无论我使用哪个 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) 即使对于不是明确位标志的值,当以十六进制写入时,通常也有更明显的故意位模式。

例如,所有 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

3) 十六进制值允许有前导零,因此更容易排列这些值。这可以使阅读(和校对)更容易。您可能会惊讶于十六进制和八进制文本中允许使用前导零但十进制不允许,但是 the C++ spec说得很清楚

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

关于constants - 为什么库的 C 头文件中的常量总是定义为十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479061/

相关文章:

c++ - 通过引用访问 const 的语法

syntax - Racket(lisp 编程语言)中的 [ ] 和 ( ) 括号有什么区别?

java - 创建文件并返回枚举作为结果的模式或约定

c - 二进制到十进制和十六进制(一点一点)

c - 如何将字符缓冲区中的十六进制地址转换为写入内存

objective-c - 如何在 Objective C 中将十六进制数转换为整数和字符串?

c - 使用 const 数据结构初始化数组

iPhone Mach-O 二进制文件,字符串存储,__TEXT/__DATA

c++ - 参数传递礼仪 (C++) const 与 value

c++ - 自 C++14 以来,总是更喜欢 set<T, less<>> 到 set<T>?