Можно ли проверить, определен ли макрос C в вашей системе в Rust? - PullRequest
1 голос
/ 08 июля 2019

Мне известно, что библиотека libc в Rust содержит большую часть стандартных макросов C и функций для использования в Rust, но в ней также говорится, что она не связана с переносимостью между системами. Я портирую некоторый код, который чрезвычайно интенсивно использует макросы препроцессора C, с C на Rust и включает в себя некоторый код, только если определен данный макрос: в данном случае O_BINARY. Можно ли проверить, определен ли в моей системе макрос O_BINARY в Rust, и если да, то как это выглядит?

Я ищу конструкцию, которая может довольно близко копировать этот синтаксис C:

#ifdef O_BINARY
// Some extra code here
#endif
// Regular code

1 Ответ

4 голосов
/ 08 июля 2019

Вы можете запустить препроцессор C в скрипте сборки и проверить вывод. Если макрос определен, мы можем передать флаг функции в код Rust.

Cargo.toml

[build-dependencies]
cc = "1.0.37"

build.rs

fn main() {
    let check = cc::Build::new().file("src/o_binary_check.c").expand();
    let check = String::from_utf8(check).unwrap();
    if check.contains("I_HAVE_O_BINARY_TRUE") {
        println!("rustc-cfg=o_binary_available");
    }
}

ЦСИ / o_binary_check.c

#ifdef O_BINARY
I_HAVE_O_BINARY_TRUE
#else
I_HAVE_O_BINARY_FALSE
#endif

Настройте этот файл соответствующим образом, чтобы найти ваши макросы.

ЦСИ / main.rs

fn main() {
    if cfg!(feature = "o_binary_available") {
        println!("O_BINARY is available");
    } else {
        println!("O_BINARY is not available");
    }
}

Смотри также:

...