问题
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?
回答1:
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.
回答2:
If the constant values refer to bit flags, and are intended to be combined, then Hex notation is a convenient way of displaying which bits are represented.
For example, from a Boost header:
// Type encoding:
//
// bit 0: callable builtin
// bit 1: non member
// bit 2: naked function
// bit 3: pointer
// bit 4: reference
// bit 5: member pointer
// bit 6: member function pointer
// bit 7: member object pointer
#define BOOST_FT_type_mask 0x000000ff // 1111 1111
#define BOOST_FT_callable_builtin 0x00000001 // 0000 0001
#define BOOST_FT_non_member 0x00000002 // 0000 0010
#define BOOST_FT_function 0x00000007 // 0000 0111
#define BOOST_FT_pointer 0x0000000b // 0000 1011
#define BOOST_FT_reference 0x00000013 // 0001 0011
#define BOOST_FT_non_member_callable_builtin 0x00000003 // 0000 0011
#define BOOST_FT_member_pointer 0x00000020 // 0010 0000
#define BOOST_FT_member_function_pointer 0x00000061 // 0110 0001
#define BOOST_FT_member_object_pointer 0x000000a3 // 1010 0001
回答3:
It is shorter, but more importantly, if they are bit flags, it is easier to combine them and make masks.
来源:https://stackoverflow.com/questions/11479061/why-are-constants-in-c-header-files-of-libraries-always-defined-as-hexadecimal