Description
It would be great if the Rust code generated by bindgen would keep the number bases of the integer literals in the input C and C++ code. After all, the writer of the C or C++ code probably had a good reason for using a specific radix.
C++141, C232, and Rust3 all support binary, octal, and hexadecimal base numbers, with C++14 and C23 sharing the same syntax. A one-to-one mapping with Rust seems to be possible.
For example, given the following code working in both C23 and C++14:
#define BIN_LIT 0b10
#define OCT_LIT 010
#define HEX_LIT 0x10
the generated Rust bindings would be:
pub const BIN_LIT: u32 = 0b10;
pub const OCT_LIT: u32 = 0o10;
pub const HEX_LIT: u32 = 0x10;
The bases of const
s and enum
s would be kept as well.
A bit of not too serious motivation
Just for the reference, if someone finds this interesting. I ran the following command in a fresh git clone of the Linux kernel repository, finding lines in .h
files only that have a #define
with a hexadecimal literal later on that line:
rg "\#define.+\b0x" --type h | wc -l
Currently, that's 4 519 652 such lines.
Footnotes
-
ISO/IEC 14882:2014 draft N3054, chapter 6.4.4.1 Integer constants ↩
-
ISO/IEC 9899:2023 draft N3797, chapter 2.14.2 Integer literals ↩
-
Rust Reference: 2.6 Tokens, Number literals, 8.2.1 Literal expressions, Integer literals expressions ↩