There are a couple of features of C/C++ in Visual Studio 2015 that are easy to overlook, but that I’m really looking forward to using. Two of those features that I’m most eagerly anticipating are support for binary literals and digit separators.
Kinda boring, you say? Hardly!
If you work with hardware, you are certainly familiar with having to create definitions of register fields for your driver header files based on the definitions in the chipset data book. The definitions are always of the form:
FRED Register (offset 0x40):
INT_ENABLE(0:1)
INT_PENDING(3:1)
INT_SOURCES(10:4)
and the like. This process always makes me nuts. It forces me to sit down, write the bits in binary, and convert them to hex, so they eventually look like in the following:
#define FRED_INT_CHANNEL 0x78000000 #define FRED_INT_ERRORS 0x07000000 #define FRED_INT_SOURCES 0x00003C00 #define FRED_INT_RESMBZ 0x0000FFC0 #define FRED_INT_PENDING 0x00000008 #define FRED_INT_ENABLE 0x00000001
The problem with this is (a) it’s an annoying process, and (b) the result is pretty much entirely opaque. Once I’ve converted the definitions to hex, unless they’re very simple like the ones for FRED_INT_ENABLE and FRED_INT_PENDING in the above example, the definitions lose all intuitive meaning. I can’t get a picture in my mind as to what these register bits look like. Heck, I can barely tell at a glance if any of the fields I’ve defined overlap!
This is where binary literals and digit separators enter the picture. Instead of the above hex nonsense, starting with VS 2015 you can quickly cook-up definitions like these:
#define FRED_INT_CHANNEL 0B0111'1000'0000'0000'0000'0000'0000'0000 #define FRED_INT_ERRORS 0B0000'0111'0000'0000'0000'0000'0000'0000 #define FRED_INT_RESMBZ 0B0000'0000'1111'1111'1100'0000'0000'0000 #define FRED_INT_SOURCES 0B0000'0000'0000'0000'0011'1100'0000'0000 #define FRED_INT_PENDING 0B0000'0000'0000'0000'0000'0000'0000'1000 #define FRED_INT_ENABLE 0B0000'0000'0000'0000'0000'0000'0000'0001
Ah! I don’t know about you, but to me that looks one heck of a lot more clear. I now can see which bits are contiguous, which are adjacent, and I get a nice picture of the register’s layout.
OK, so maybe it’s a small thing. But it’s the kind of thing that I know will make my dealings with hardware easier.