Skip to content

Keep the integer literal radices of C and C++ in generated Rust #3236

Open
@miikkas

Description

@miikkas

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++14, C23, and Rust 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 consts and enums 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions